質問

C ++構造体があります

struct UnmanagedStruct
{
   char* s;
   // Other members
};

およびC#構造体

struct ManagedStruct {
   [MarshalAs(UnmanagedType.LPStr)]
   string s;
   // Other members
}

C ++ライブラリが公開する

extern "C" UnmanagedStruct __declspec(dllexport) foo( char* input );

そして次のようにインポートされます

  [DllImport("SomeDLL.dll", CharSet = CharSet.Ansi)]
  static extern ManagedStruct foo( string input );

ただし、この関数を呼び出すと、取得します

MarshalDirectiveExceptionが処理されませんでした

メソッドの型シグネチャはPInvoke互換ではありません。

問題は、構造体からchar * sと文字列sを削除すると、この関数呼び出しが機能することです。

役に立ちましたか?

解決

このタイプのシナリオでは、文字列を直接使用しないでください。代わりに、タイプをIntPtr値に切り替え、必要に応じてMarshal.PtrToStringAuto / Ansi / Uniを使用します。この場合、ネイティブコードは char * を使用するため、PtrToStringAnsiが最適です。

struct ManagedStruct {
  IntPtr s;
  public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top