3


0

C構造体があります

UnmanagedStruct {char * s; struct //他のメンバー};

そしてC#構造体

struct ManagedStruct {[MarshalAs(UnmanagedType.LPStr)]文字列s; //他のメンバー}

Cライブラリが公開する

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

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

[DllImport( "SomeDLL.dll"、CharSet = CharSet.Ansi)] static extern ManagedStruct foo(文字列入力);

しかし、この関数を呼び出すと次のようになります。

MarshalDirectiveExceptionが未処理でした

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

つまり、この関数呼び出しは、構造体からchar *と文字列sを削除すれば機能します。

1 Answer


4


このようなシナリオでは、Stringを直接使用しないでください。 代わりにIntPtr値になるように型を切り替えて、必要に応じてMarshal.PtrToStringAuto / Ansi / Uniを使用してください。 この場合、あなたのネイティブコードは `char *`を使うので、PtrToStringAnsiが最良の選択です。

struct ManagedStruct {
  IntPtr s;
  public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}