文字列を含む構造体をマーシャリングするときのPInvokeエラー
-
11-07-2019 - |
質問
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); } }
}
所属していません StackOverflow