[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 02/20 17:30 / Filesize : 202 KB / Number-of Response : 866
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C♯, C#相談室 Part34



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 などで、エラーが起きることがある、と。

この辺の、動作に関するドキュメント等ありませんでしょうか?






[ 続きを読む ] / [ 携帯版 ]

全部読む 前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<202KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef