1 名前:デフォルトの名無しさん [2007/08/26(日) 12:42:25 ] (#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。 前スレ C#, C♯, C#相談室 Part41 pc11.2ch.net/test/read.cgi/tech/1184840053/ 過去スレは>>2-5 あたり。
301 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:27:25 ] そんなのインテリセンスなりナンチャラペットの水準でサポートすれば 済むことじゃないの? まあ、それ以前にドキュメントをちゃんとして欲しいよねw
302 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:09:05 ] constもチェック済み例外も問題の根は同じ。不必要に実装に結び付く(透けて 見せる)シグニチャである点。
303 名前:デフォルトの名無しさん [2007/09/03(月) 23:15:15 ] >>277 あんた、単なる素朴な疑問かと思ってたけど 真正のあほだな
304 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:16:10 ] VC# ExpressEditionダウンロードしたんだけど オフラインでMSDN見ることってできないんですか?
305 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:21:54 ] ふらっとに行くべき
306 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:31:16 ] >>302 意味がよくわからないから詳しく説明してくれ
307 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 01:41:01 ] >>290 に同意。費用対効果の低いフェースセーフ要らないぽ constだので縛ってもバグは斜め上からやってくるね。 sealedつけてたのにsealed外されるとか。 foreachといえば、配列に関してはfor文と同等の速度が出ますが、こういう情報はどこにあるのでしょうか? パフォーマンスガイドラインに重いループではforeachよりforって書いてあったので わざわざ変えたのに・・悲しい。
308 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 02:21:04 ] 英語だけどパフォーマンスの話題はここが詳しいかな msdn2.microsoft.com/en-us/library/ms998547.aspx 1.1に基づいてるからまだforが速いって書かれてはいるが・・・ msdn2.microsoft.com/en-us/library/aa137140.aspx ここにもパフォーマンスの記事が結構たくさんあるね 特にKnow What Things Costは命令ごとのコスト表が載ってて面白いかも
309 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 02:52:52 ] >>307 2.0だとforeachのほうが若干早くなってますね。 foreach (int v in ar) csum += v; for (int i=0; i < 10000; i++) csum += ar[i]; これを下のように書くとforeachと同じスピードになるからそういう最適化をしてるのでしょう。 fixed (int *sp = &ar[0]) { int *ep = sp + 10000; for (int *p = sp; p < ep; p++) csum += *p + j; } ただ、foreachの制御変数が読み取り専用なのは、フェイルセーフのためなのか、 最適化のためなのかは判断がつきません。
310 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 07:54:38 ] アンセーーーーーフ!! なるほど、「処理を直接記述されると最適化できないが 抽象度を高くすると最適化しやすい」というやつか forよりforeachの方が早い LINQも早くなるという しかしループ変数への代入を許すとこの最適化が出来なくなるわけか
311 名前:デフォルトの名無しさん [2007/09/04(火) 09:28:17 ] アンマネージドのコードと同期をとりたく、 EventWaitHandle.Handle プロパティで ネイティブのハンドルを取得しようと思ったのですが、 「古い形式です」と起こられてしまいます(警告)。 新しい形式ではどのように書くのでしょうか?
312 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 09:37:04 ] >>311 MSDNにずばり書いてあるから、まず自分で調べるくせをつけろ。
313 名前:デフォルトの名無しさん [2007/09/04(火) 09:37:06 ] あ、 EventWaitHandle.SafeWaitHandle.DangerousGetHandle() でいいみたい。 Safeなんだか、Dangerousなんだか。
314 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 10:15:09 ] >>313 DangerousGetHandle()は必要? MSDNでは、 >このクラスを使用すると、派生クラスのインスタンスでラップされたアンマネージ リソースを >識別するハンドル (オペレーティング システム ハンドルなど) をアンマネージ コードに >渡すことができます。 となってるし、使用例にあるWindowsAPIの呼び出しサンプル見ても、IntPtrの代わりに使ってる。 というか従来のIntPtrの代わりに使うべきもののように見える。 DangerousGetHandle()はデバッグのためにハンドル値を16進でダンプしたいとかの特殊用途のために 残してあるんじゃないか。
315 名前:デフォルトの名無しさん [2007/09/04(火) 11:08:29 ] >>314 なるほど。ほんとだ。 ハンドルは、PVOIDだろ、と、 [DllImport("native.dll")] public static extern void NativeFunc(System.IntPtr hHandle); して、Handleプロパティから渡していたので、、 替わりにSafeWaitHandle使えと言われても、型が違ってこまってました。 [DllImport("native.dll")] public static extern void NativeFunc(SafeWaitHandle hHandle); こうすればいいんですね。
316 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 12:42:53 ] デンジャラスなんてついてるメソッド使いたくないお
317 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 13:35:00 ] IntPtrで問題が発生したら泣き寝入りするお
318 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 18:41:40 ] >>316-317 正直、「ボキュはキモヲタだお」って言ってるようにしか聞こえない。 そういうの気色悪いと思わない自分を気色わるいと感じるべきだ。
319 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 18:48:43 ] どうか、次のVBをC#に直して下さい。 Label1.Text = Replace(Session("body"), vbCrLf, "<br />") ----------------------------------------------- VBの本の中にソースが載っていたのですが、 この1文が、どうにもわかりません。 そのコード意味は、どうやらセッションというデーター内の改行を HTMLの改行に変換するっぽいのですが・・・。(推測) ちなみに、他の行は自力で調べましたが肝心のこのコードが分りませんし、 C#でどう書けば良いのか分りません。 賢者の方々、どうか愚者の私にご指導をお願い申し上げます
320 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 18:54:20 ] >>319 少しはググるとか努力しろよ VB.NET固有の関数をC#で使用するには? www.atmarkit.co.jp/fdotnet/dotnettips/254vbfunc/vbfunc.html でも、それただの部分文字列の置換でしょ? String.Replaceか正規表現で代用できるでしょ。
321 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 18:54:33 ] >>319 zoosir.hp.infoseek.co.jp/tips/string/string03.htm C#だと省略可能引数(Optional)が無いから、全部書く必要があるらしい。
322 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:35:51 ] >304 MSDNも普通にフリーとして公開されてなかったか?
323 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:54:39 ] csc.exeやvbc.exeって開発環境がなくてもインストールされるものなんですか? C:\windows\Microsoft.NET\framework\以下にあるのでそんな気がしますが。
324 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:57:13 ] はい。実行時に使用する場合もあるので、全ての環境に含まれています
325 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 22:03:35 ] >>324 おお、そうだったんですか。 これで安心してCodeDomが使えます。
326 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 22:17:14 ] 標準添付はcsc/vbc/jscの三つ、だったかな確か clは非標準だよね 標準なのにドマイナーなのがひとつ
327 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:09:57 ] Control.Invoke系のメソッド呼ぶとどっかで内部的にファイナライザが必要になるっぽいな。 ループの中から呼んだりして大丈夫なんだろうか。 何千何万って呼んだらなんか嫌なことになりそうな気がする。
328 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:15:47 ] ここは散文を書くところではない。 説明調の、他人に意味がちゃんと通じる文章書けよ
329 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:23:22 ] え、ファイナライザのコストが高いことを説明しろってこと? それは説明するまでもないと思ったけど。 何が通じてないのかわからん。 Invoke系のメソッドってのはInvoke、BeginInvokeのことだよ それらを呼んだら内部的に生成されるオブジェクトでファイナライザが呼ばれるっぽいんで嫌だなって話。
330 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:37:10 ] 何をみてそう思ったの?
331 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:38:28 ] >何が通じてないのかわからん。 読む側の立場に立って自分の文章推敲できない人間はたいていそうだ。 ついでに、ファイナライザのコスト? 意味がわからない。 デリゲートを処分するコストがそんなかかるのかね? 仮にかかるとして、コストとは「時間当たりのCPUの使用量」のことだと思うが、 どのみちmsのオーダーでInvokeとか不可能だから意味がないだろう。
332 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:39:31 ] >それは説明するまでもないと思ったけど。 いったいどんな頻度でControl.Invokeなんかを実行する気だ?
333 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:44:23 ] >>327 再描画を伴わないControl.Invokeの使い道って あんまり思いつかないんだけどどうだろ? 経験上、何千何万って単位でControl.Invokeを呼ぶと 再描画コストが恐ろしいことになる。 WinFormsなら1秒間に10回ぐらいの更新でいいんじゃないかね? まあそれ言い出すとTimerでいいじゃんて話も多いんだけど。
334 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:44:31 ] >>330 CLR Profilerで見れるよ。 >>331 msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdndotnet/htm/dotnetgcbasics.asp この辺でも読んでくれ。 なんでデリゲートが出てくるのかわからんが・・・ >>332 別スレッドでなんかの処理中にUIを更新するために呼んだりしない? まあ何万は言いすぎかも。
335 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:04:23 ] >>322 ヘルプから見れるキーワードとか目次がMSDNなんですか?
336 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:05:13 ] >>334 読んでくれって、どこにもお前さんが主張しているような類のことは書いてないだろw
337 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:10:27 ] >334 CLR Profilerで見れるよ。 Control.Invokeを使ったらファイナライザが実行されたってこと?EndInvokeしてても?
338 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:13:32 ] ファイナライザのコストが高い(高くなりうる)ということ自体はわかるが、 Control.Invokeで実行されるというファイナライザを持つオブジェクトが内包するオブジェクトとか。 Control.Invokeを実行する通常の頻度とかから考えて、それが問題になるほどコストが高いとは思えん ということだよ。 「ファイナライザのコストが高い」という表現自体をそのまま疑ってるんじゃない。 ついでにEndInvokeしたらファイナライザは実行されないんじゃないの?普通に考えて。 と思っただけで、まあこれはプロファイラで確認してそうなってるってんならそうなのかもしれん。
339 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:17:46 ] >>335 VS2005 Expressのヘルプに標準で何が入っているかは知らないが、MSDNライブラリはこれ。 ttp://www.microsoft.com/downloads/details.aspx?FamilyID=b8704100-0127-4d88-9b5d-896b9b388313&DisplayLang=ja 2.5Gバイトほどあるから注意してくれ。
340 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:22:22 ] ファイナライザはそれを行わなければならないものが一つでもあると GCを二回行わなければならず単純計算でGCにかかる時間が倍になるんじゃなかったか
341 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:27:36 ] >>337 >>338 EndInvokeしても呼ばれるみたい。 やっぱgen0でちゃちゃっと回収されるから問題が少ないってことなのかな? 具体的にはControl.ThreadMethodEntryってオブジェクトだけど ファイナライザの処理自体はシンプルだけど他のオブジェクトへの参照は割とごっそり保持してるみたいだな。 まあ他に代替手段があるわけじゃなしどうこういっても仕方ないんだけどね。
342 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:42:58 ] おお?なんだこの意味なしFinalizeはw いらねーじゃねーかよ。
343 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:48:44 ] >他のオブジェクトへの参照は割とごっそり保持してるみたいだな。 そんなに困らないオブジェクトが多いけどな。 まあ引数とか戻り値はクリアしてほしいところだが
344 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:58:26 ] だいたい、GEN1までで回収できたら、負荷的にはまあそんなに大きくはならないようだな。 GUIアプリだし、特にControl.Invokeなんて同期実行なんだから、まあ普通はまずGEN1ですべて回収できるだろう。
345 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 02:05:06 ] SuppressFinalizeを書き忘れてるんじゃないか
346 名前:319 mailto:sage [2007/09/05(水) 11:20:12 ] >>321 賢者 一応、下記ソースに変更出来ました。 的確な助言、ありがとうございました。 if ((string)(Session["Body"]) == null) { Label1.Text = "<br />"; } else { Label1.Text = ((string)(Session["Body"])).Replace("\r\n", "<br />"); }
347 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 11:24:43 ] 暇があったら as 演算子を調べとくといいよ
348 名前:319 mailto:sage [2007/09/05(水) 11:45:52 ] >>347 神へ ご助言の通り、as演算子をしらべました。 お陰でたまに出るエラーがなくなりました。 さすがは神ですね。 即レスにも関わらず、100%的中でした。 なぜ、私がたまに出る意味が理解できないエラーで苦労している所を お察し出来たのか愚民にはわかりませんが、 貴方の英知で、救われました。 再びお礼を申し上げます。 string s = (string)(Session["Body"]) as string; if (s == null) { Label1.Text = "<br />"; } else { Label1.Text = ((string)(Session["Body"])).Replace("\r\n", "<br />"); }
349 名前:319 mailto:sage [2007/09/05(水) 12:08:38 ] ※すみません。下記に訂正しました。 string s = (string)(Session["Body"]) as string; if (s == null) { LabelBody.Text = "<br />"; } else { LabelBody.Text = s.Replace("\r\n", "<br />") + "<br />"; }
350 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 12:18:23 ] まだキャストしてんじゃん。 string s = Session["Body"] as string; じゃないとエラーでるっしょ
351 名前:319 mailto:sage [2007/09/05(水) 12:22:14 ] >>350 いいえ。 今の所、何もエラーがでませんが? でも、助言ありがとう。
352 名前:デフォルトの名無しさん [2007/09/05(水) 12:39:14 ] >351 エラーは出ないけど string m = ((string)"Hello") とはやらないだろって事じゃない?
353 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 12:59:04 ] >>352 うん。私もそう思ったので、助言どおりに直しました。 だから、「助言ありがとう」とカキコしたよ。(^^
354 名前:デフォルトの名無しさん [2007/09/05(水) 13:34:37 ] foreachを書き込みしたいっていう人は具体的に何をしたいの? 1. foreachのループの中でコレクションの書き換えをしたい。 2. foreachのループ変数を書き換えることによって、ループの制御をしたい 1.なら foreachのループ変数はコレクションの要素とは無関係な場合もある。 そもそも、IEnumerableには「要素」の概念はないし、arrayみたいにIListを実装した インデックスを通じて要素にアクセスできるコレクションとは限らない。 2なら、ループのカウンタはIEnumerableの内部でループ変数とは別に 管理されているから、無駄(というか、おそらく何も起きない)。 だと思うんだけれど、ほかに何か書き込み許容するといいことってありますかね?
355 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 13:54:18 ] 今更その話か ちゃんと読めとしか言いようがないが、1でも2でもない(つーか2は意味がわからんが) あえて例を出すならこんなことがしたいんでしょ foreach (string str in input) { str = str.Trim().ToLower(); if (str.Length == 0) throw new exception("Invalid"); Console.WriteLine(str); }
356 名前:デフォルトの名無しさん [2007/09/05(水) 14:15:34 ] >>355 なるほど、そういうことか。全然議論が見えてなかった。 Console.WriteLine(str.Trim().ToLower()); でも書き込み禁止だとエラー出るのかな??? 355さんの例みたいに条件分岐したいような場合は たとえ書き込み禁止じゃなくても、可読性のために仮変数おいたほうが いいとおもうけど…。
357 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 14:15:34 ] >>353 object o = 1; string s = (string)o as string;
358 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 14:29:43 ] えーっとだな… それはなんだ?
359 名前:デフォルトの名無しさん [2007/09/05(水) 15:28:55 ] C#からC++のクラスライブラリを利用するには、 ttp://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_03.html のように、publicメンバすべてをラップしか、方法ありませんか?
360 名前:デフォルトの名無しさん mailto:age [2007/09/05(水) 15:30:10 ] dt=$.split(' \n');dt[dt.length]='';for(i=0;undefined!=dt[i];i+=2){write(dt[i-i%2+1].replace('jp.','').replace('www.',''));br();write(dt[i-i%2]);br();}
361 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 15:36:46 ] >>359 使うメンバだけラップすれば良いよ。 COM 化するって手もある。
362 名前:359 [2007/09/05(水) 15:53:00 ] >>361 なるほどCOMって手も。。 説明まちがえた。 すべてのメンバか使うメンバだけって、ところが問題じゃなく、 いちどC++/CLIでラップしなければいけないのかどうか、知りたかった。 ラップするのはここではC++/CLIだが、 直接C#でラッパを書いて、マネージドのクラスライブラリを作ることは 可能ですか?
363 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 16:01:12 ] >>362 C++/CLI でラッパを書く、C++ で COM 化するのいずれも避けるには?ってことですか。 ヘッダファイルとオブジェクトファイル(あるいはソースコード)で供給されるような普通の 良くあるクラスライブラリの場合、そもそもライブラリ側のコードを呼び出す手段が無い ですよね。 dllexport されているクラスなら MSVC の ABI に従って呼び出してあげれば動くでしょうけど、 そういうライブラリはあまりないし、割に合わないような気がする。
364 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 16:34:36 ] 今ハードウェアとやりとりをしなければならないので、PInvoke を使って DLL にアクセスしています。 この DLL の Open 関数を構造体を引数として呼んであげると、この構造体の中にデータが入って 返ってくるというものです。 で問題はこの構造体のメンバに構造体の配列が入っており、この構造体の配列を取得することが できません。( 構造体の他の int のメンバは取得できています。以下でいうところの ID ) このような構造体下の構造体を取得することはできないのでしょうか。 struct Parent { public int ID; public Data[]; } struct Data { public int RawData; public int Length; }
365 名前:359 [2007/09/05(水) 16:38:33 ] >>363 すみません、最後の、 dllexport されているクラスなら(snip)動くでしょうけど、 について、もすこし教えてください。dllexportすれば、 C#から直接呼べますか?
366 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 16:59:15 ] >>365 exportする側は msdn2.microsoft.com/ja-jp/library/a90k134d (VS.80).aspx あたりを参照 メンバ関数がどういう名前でexportされるかはコンパイラ依存。 dll 生成時の出来る lib を見て自分で調べる。 仮想メンバ関数は vtbl 経由でアドレスを取得。 MSVC の 呼び出し規約は基本 __cdecl ですが this を ecx に入れて呼ばなきゃないので、 そこだけは C++ というかアセンブラの補助が必要ですね・・・
367 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 17:00:01 ] あなたがCでDLLExportされたC++クラスのコンストラクタを起動し、 vtblに格納されているか少なくとも名前マングリングされたthisコールの メンバ関数を起動し、スローされた例外を上手いこと取り扱い、最後に デストラクタを起動して破棄できるのなら、C#でもきっと出来るだろう。
368 名前:デフォルトの名無しさん [2007/09/05(水) 18:36:48 ] 大人しくEXEキックしてコンソールで取り込めば?
369 名前:359 [2007/09/05(水) 19:13:34 ] >>366 367 368 みなさん。ありがとうなんとなく理解した。 [DllImport("native.dll")] extern static void Hoge()で、 C#から、Cの関数は呼べる仕組みがあるし(マーシャリングもあるし)、 マネージドであるC++/CLIからは、C++/Native のオブジェクトをnewできるし、 なので、C#からC++/Nativeにアクセスできる方法も実はあるんじゃないかと、 ちょっと期待して質問してました。
370 名前:デフォルトの名無しさん [2007/09/05(水) 21:11:06 ] >369 これはマジレス キャストやアンマネージDLLを使うならVB.NETがいい。 VBFixedArrayにDECLAREで処理するDLLをC#で呼ぶ。 アンマネージVBが噛むと処理が激重だから、処理が軽いもの限定だけど。 FORTRAN C C++ で構造体処理するDLLも一発でいくよ
371 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 21:12:58 ] VB 使うくらいなら俺は C++/CLI を選ぶぜ
372 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 21:29:01 ] エクセルとか操るならVBの方がずっと楽だと思うけど、 アンマネージdllの関数呼ぶ手間はあんまり変わらないんじゃない?
373 名前:デフォルトの名無しさん [2007/09/05(水) 21:32:03 ] >371 C++/CLIでやるのもありだな。2003ですまない
374 名前:デフォルトの名無しさん [2007/09/05(水) 21:34:15 ] >372 それはVB.NETじゃなくないか?
375 名前:359 [2007/09/05(水) 21:38:27 ] >>370 ラッパをVBで書く? >>371 私もなんとなく同意。 やりたいことは、ネイティブなC++クラスライブラリを、 マネージド(C#)から使えるクラスライブラリにしたい。です。 結局C++/CLIでくるむ方法を取ることになりそうで検討中ですが、、 publicなクラス → ラッパクラス interface → ?? publicなメンバ関数 → 全部ラッパ publicなメンバ変数 → プロパティ #define定数 → static const な定数 struct → ?? enum → ?? どのように書き換えたらいいか、わからないとこ満載だ。 どなたか、??のところを教えてください。
376 名前:デフォルトの名無しさん [2007/09/05(水) 21:41:15 ] バイナリーを読む場合ポインタTOストラクチャを使うC#に対してVBは一発で入るよ? 同じかな?
377 名前:デフォルトの名無しさん [2007/09/05(水) 21:43:47 ] >375 それなら2005を買ってみな。 ヘッダ読めばそのまま動く
378 名前:デフォルトの名無しさん [2007/09/05(水) 21:48:34 ] すまない、ちょっと言葉が足りなかった 使いたいライブラリをC++でインクルード コンパイル C#で参照設定 .NETプロジェクト これで全部使える
379 名前:デフォルトの名無しさん [2007/09/05(水) 21:52:49 ] VB.NETでラッピングする場合は、DECLAREで定義。引数は全てVARIANTのFIXEDARRAY (OBJECTだと通らないから注意) で、きちんとした型をCTYPEで渡せば動作する 楽じゃないか?
380 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 21:56:22 ] >>375 >マネージドであるC++/CLIからは、C++/Native のオブジェクトをnewできるし、 ネイティブのライブラリは実はCのランタイムライブラリが裏で色々サポートしているので newの部分だけ見てても混乱するよ。 内部でCRTヒープ使ってるかもしれないし、 atexitみたいなコールバックに依存しているかもしれない。 一般論として、Cのライブラリは静的リンクなり動的リンクなりのCRTを必要とする。 そのCRTとの連携無しに、C#から 直接Cのコード使おうってのはちょっと無謀じゃないかな。 相手がDLLの場合、LoadLibraryされたときに自分でCRTの初期化やるから その辺気にする必要はないんだけど。
381 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:44:08 ] んん? そのためのC++/CLIなんだから、CRTのルールを守らず アセンブリをロードするとは思えんけど。 msdn2.microsoft.com/ja-jp/library/ms173266 (VS.80).aspx
382 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:50:54 ] >>381 C++/CLIはそれでOK。そこは同意。 よく分からないのは359が言うところのクラスライブラリが どんなファイル形式なのかかな? 1) *.h 単体 (テンプレートライブラリ) 2) *.h+*.lib 3) *.h+*.obj 4) *.h+*.dll 5) *.h+*.cpp >>>359 は >いちどC++/CLIでラップしなければいけないのかどうか、知りたかった。 とか書いている割に、どんな形態で配布されているライブラリなのか 未だに明かしていないみたいだけど。
383 名前:359 [2007/09/06(木) 01:46:34 ] >>382 わかりにくくてすんません。一番最初にあげたurlの記事の内容そのまんまで、 WIN32で書いてあるスタティックのライブラリ。 2) *.h+*.lib ってことになります。 ttp://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_03.html で、このとおりやってみようと思ったのだが、 >>375 で書いたとおり、メンバ関数をラップするだけじゃ足りなくて、 その他もろもろ細かいところすべて書き換えなきゃならなくなって。。。 ホントにこれが普通の方法なのか?もっとエレガントな方法があるのでは。 と、思ったのでした。 ちなみに、すべてではないですが、 4) *.h+*.dll の形にしたものもあります。 MFC,ATL,stlは使っていなく、CRTは使っているものとそうでないものが。 >>380 >>381 Nativeと.NET、両方が扱える言語は、C++/CLIだけで、 っていうか、C++/CLIはそのために存在している。ので、いまこそ使うときだ。 ってことですかね。
384 名前:359 [2007/09/06(木) 02:01:14 ] >>370 >>379 VB.NETはまったく未開の地だ。ちょっとみてみる。ありがとう。 >>377 >>378 ん。COMの話?
385 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 11:42:05 ] どうもデリゲートの使いどころがわからないんですが イベントのメソッドはわかるんですが おーデリゲートってすげー!!! っというような使用法ってどういうのですかね
386 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 11:48:38 ] //List<int> list; list.Sort(delegate(int x, int y){return y.CompareTo(x);});//逆順ソート
387 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:18:08 ] >>385 そもそもイベントはdelegateのシンタックスシュガー似すぎな一ツーの
388 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:40:05 ] >>386 それって匿名メソッドスゲーの例じゃないの。
389 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:46:03 ] C#2.0になってジェネリックや暗黙のインスタンス作成や匿名メソッドが付いて デリゲートが使いやすくなったけど、その前は単体ではあんまり積極的に使われなかったような
390 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 13:00:11 ] イベントとか意味わかんねえ +=と-=しかできないし なんに使うんだよ
391 名前:デフォルトの名無しさん [2007/09/06(木) 13:01:53 ] >>390 イベントのハンドリングだとおもう。
392 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 13:04:04 ] 普通にdelegate使った方が入れ替えられて便利じゃん 無駄なフェイルセーフだぜ
393 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 13:08:04 ] 一応プロパティと同じように実装の変更もできる
394 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 13:08:20 ] >>390 IDEによるポトペタ
395 名前:385 mailto:sage [2007/09/06(木) 13:17:22 ] >>386 >>388 そうですね匿名メソッドですね >>387 そうですか…なんかイベントの話になってきてますね んーデリゲートでこんな風にしたらすっごい便利! とかいう話ないですかね
396 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 13:45:38 ] void Hoge() { list.ForEach(Print); } void Print(int x){ Console.WriteLine(x); } コレクション関係以外にないかなあ
397 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 13:58:02 ] >>395 処理のインジェクションしたいところにはdelegateばんばん使ってます。 クラスの生成時とかにそのシチュエーションに併せて動作を変えたいとき便利。
398 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 14:00:41 ] インターフェースを実装したクラスを作るよりも楽>delegate
399 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 14:55:19 ] Action<T>は interface IHoge<T> { void Method(T arg); } とだいたい同等で class A { public Action<Foo> Action; } class A { public IHoge<Foo> Action; } これもだいたい同等 a.Action = delegate(Foo foo){ .... }; これと class FooHoge : IHoge<Foo>{ ... } a.Action = new FooHoge(...); これも大体同等 匿名メソッドなら直接かけるから一々定義したクラスを読まなくてすむので見やすい ラムダ式になるともっと便利になる 匿名メソッド使わなくても、引数さえ合えばどんなメソッドでもはまるから、 いちいちinterface実装したクラスを作らなくて済む分楽 でもやっぱり真価は匿名メソッドで出てくる
400 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 15:04:40 ] interfaceでは大げさすぎる場合も多いし、例えばイベントハンドラを インタフェースとして実装した場合、同じWidgetを複数個持とうとするとに インタフェースが衝突する、といった問題が生じる。Javaではこれを解決 するのに一々ゴテゴテと無名クラスを記述する羽目になり、実に馬鹿馬鹿しい限りだ。 ラムダ式が無くとも、delegateであれば上記の問題は普通に解決することが 出来る。 まあ、処理を汎用化したり(例えば描画ルーチンに、PixelをPutする ルーチンだけdelegateとして与えられるようにすれば、汎用になる)、 テーブルジャンプっぽく使ったり(メニュー等のindexとdelegateの配列を 結びつけたりする)、意思決定と実行のタイミングが分かれている場合に、 意思決定→delegate変数に保存→delegateを用いて実行といったことをやったり (実行が何度も行われる際に、無駄な条件分岐を完全に取り除くことが出来る)、 色々と応用範囲は多い。