- ベストアンサー
C++/C#間での構造体の引き渡し方法に関するコンパイルエラーの原因
- C++とC#で構造体を定義して引き渡ししようとした際に、「Msg*から_Msg*に変換できません」というコンパイルエラーが発生してしまう。構造体の定義は同じなので、原因は何か。
- C++で定義した構造体をC#から呼び出そうとしているが、「Msg*から_Msg*に変換できません」というコンパイルエラーが出る。
- C++とC#で同じ構造体を定義して引き渡ししようとしたが、「Msg*から_Msg*に変換できません」というコンパイルエラーが発生してしまう。原因は何か。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
// C++/CLI側の例。 namespace CppCliString { // マネージ構造体(値クラス)。 public value class MessagePack { public: UInt32 Code; UInt32 SessionId; }; public ref class Class1 { public: static void PrintAndClear(MessagePack% msg) { printf(__FUNCTION__ "(): Code = 0x%08X, SessionID = %u\n", msg.Code, msg.SessionId); msg.Code = 0xFFFFFFFF; msg.SessionId = 0; } }; } // C#側の例。 { CppCliString.MessagePack msg = new CppCliString.MessagePack(); msg.Code = 10; msg.SessionId = 7; Console.WriteLine("Code = 0x{0}, SessionID = {1}", msg.Code.ToString("X8"), msg.SessionId); CppCliString.Class1.PrintAndClear(ref msg); Console.WriteLine("Code = 0x{0}, SessionID = {1}", msg.Code.ToString("X8"), msg.SessionId); } C#側に合わせたデータ型定義をC++/CLI側で行なうのが基本です。 C#側にポインタ型のインターフェイスを見せるようなことは、何がなんでも避けるべきです。 というか質問を見る限り、明らかにネイティブC++とC++/CLIを混同している上に、C#でポインタを使うことがいかに非生産的な行為であるかを認識されていないようなので、C#とネイティブC++を一通り学び終えた後で、下記の書籍を熟読してからC++/CLIに手を付けることをお勧めします。 http://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5C-CLI-%E6%A5%B5%E3%82%81%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%A8%E5%AE%9F%E7%94%A8%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-%E4%B8%AD-%E5%8D%9A%E4%BF%8A/dp/4797336277
その他の回答 (1)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
C++のstructとC#のstructはまったくの別物てことをふまえての質問でしょうか?
お礼
丁寧なご回答ありがとうございます。 おかげさまで、やりたいことを実行できました。 ご指摘通り、もうすこしC++/CLIについて勉強したいと思います。 ありがとうございました。