• 締切済み

VC#からdll関数を使う

c#(vs2003)から、c++で書かれたdllの中に含まれる関数を読み込む部分を書いています。この関数は以下のように定義 され、構造体のポインタを返り値として返します。 SENSOR* GetSensor(); SENSOR構造体はdllの中では以下のように定義されています。 typedef struct{   int type; unsigned short param; char name[64]; DWORD con_pos; } SENSOR; これをc#のコードの中で読み込むため、c#のクラスの中で、以下のように再定義しました。 [StructLayout(LayoutKind.Sequential)] public struct SENSOR {   public int type;   public ushort param;   public string name;   public uint con_pos; } 後にc#のコードの中に、dllの中の関数を呼び出す定義を以下のように書きました。 [DllImport("sensor.dll"); public static extern SENSOR* GetSensor(); ここで SENSOR* sensor = GetSensor(); といった感じでdllをの関数を使って値を取得するようにしたのですが、実行すると 「return value をマーシャル できません : ポインタはマーシャルされた構造体を参照できません。」 といったエラーが出ます。いろいろと調べたのですが解決方法がわかりません。アドバイスをいただけたら幸いです。

みんなの回答

回答No.3

この場合、戻り値はIntPtrかUIntPtrでは。 http://msdn.microsoft.com/ja-jp/library/system.intptr(v=vs.110).aspx http://msdn.microsoft.com/ja-jp/library/system.uintptr(v=vs.110).aspx

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

C++で char name[64]; なら C#で byte[64] name; byte[] name = new byte[64]; じゃないんでしょうか

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

エラーメッセージから判断するに、return valueで構造体へのポインタを返すことはできない(マーシャルができない)のでしょうね。 だとすれば   SENSOR* GetSensor(); ではなく   void GetSensor(SENSOR**); の形に書き直してみてはいかがでしょうか。

関連するQ&A