- 634 名前:デフォルトの名無しさん [2007/12/26(水) 02:04:57 ]
- --------正しく動くコード C#側(Form1.cs)---------
[DllImport("Hoge.dll")] extern static void GetHogeMessage( StringBuilder name, int len ); private void Form1_Load(object sender, EventArgs e) { StringBuilder msg = new StringBuilder(255); GetHogeMessage(msg, 255); this.label1.Text = msg.ToString(); } -------正しく動くコード CのDLL側(Hoge.dll)---------- extern "C" __declspec(dllexport) void GetCurrentName(char* msg, int length) { sprintf_s(msg, length, "ホゲホゲプー"); } 私のよく知る Delphiでは、string ←→ char*(PChar)間では、 コンパイル時に自動で変換コードを入れているのが、 デバッガで逆アセンブルすると、わかります。 同様に、動作を知ろうと、Reflectorで、 ILに変換したのも読んでみたのですが、コンパイラマジックなどなく、 理解にいたりませんでした。 C#は(というか、MSIL?)、内部動作的には、char* → StringBuilderでは、何をやっているのでしょうか? 私は想像では、StringBuilder.pChar のような非公開のプロパティに、char*を代入して処理しているのでは?と思っています。 そうなると、上記のエラーとなるコードでは、インスタンスを生成していないために、 強引なキャストが起き、StringBuilderとして処理はされるものの、 msg.ToString などで、エラーが起きることがある、と。 この辺の、動作に関するドキュメント等ありませんでしょうか?
|

|