アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、C++で作成したクラスを、
C#から呼び出し実行しようとしております。

引数として、構造体を利用したいので、
C++側、C#側でそれぞれ下記のように
構造体を定義しました。

【C++】
typedef struct _Msg
{
ULONG Code;
ULONG sessionId;
}Msg;

【C#】
[StructLayout(LayoutKind.Sequential)]
public struct Msg
{
public uint Code;
public uint sessionId;
}

そして、下記のようにC++側で定義したクラスを
C#側で呼び出そうとしたのですが、
「Msg*から_Msg*に変換できません」という
コンパイルエラーが発生してしまいました。
構造体の定義は同じものになっていると思うのですが、
この原因は何だと考えられるでしょうか。

よろしくお願いいたします。

【C++】
ULONG Wrap::API( Msg* sample_Msg )
{
return 1;
}
【C#】
Msg sample_msg;
Wrap.API(&sample_msg);

A 回答 (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- …
    • good
    • 0
この回答へのお礼

丁寧なご回答ありがとうございます。
おかげさまで、やりたいことを実行できました。
ご指摘通り、もうすこしC++/CLIについて勉強したいと思います。
ありがとうございました。

お礼日時:2011/02/22 12:43

C++のstructとC#のstructはまったくの別物てことをふまえての質問でしょうか?

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!