3

私は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とstringsを削除すると機能します。

4

1 に答える 1

4

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

struct ManagedStruct {
  IntPtr s;
  public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
于 2009-08-03T17:54:34.030 に答える