PInvoke を使用して、C# コードから C++ ライブラリにアクセスします。しかし、次の機能の使用に問題があります。
UINT32 myfunc(IN char * var1, IN UINT32 var2, INOUT UINT16 * var3, OUT UINT8 * var4)
ドキュメンテーションは言う:
戻りパラメータはエラーコードです
var1 は文字列です
var2 は整数です
var3 は整数へのポインタです (値は var4 のサイズになり、値は関数によって変更されます)
var4 は、関数によって埋められるバッファへのポインタです
私が使うとき
[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int myfunc(string var1, int var2, out int var3,
out byte[] var4);
関数は次の例外を与えます。
マネージ デバッグ アシスタント 'FatalExecutionEngineError' は、'C:\Users...\Documents\Projects...\bin\Debug...vshost.exe' で問題を検出しました。
追加情報: ランタイムで致命的なエラーが発生しました。エラーのアドレスは、スレッド 0x2edc の 0x74292e44 でした。エラー コードは 0xc0000005 です。このエラーは、CLR のバグ、またはユーザー コードの安全でない部分または検証不可能な部分のバグである可能性があります。このバグの一般的な原因には、COM 相互運用機能または PInvoke のユーザー マーシャリング エラーが含まれ、スタックが破損する可能性があります。
この例外のハンドラがあれば、プログラムは安全に続行できます。
パラメータを操作して、何かを取得できるかどうかを確認しようとしましたが、次のように文字セットを変更しました。
[DllImport("mydll.dll, CallingConvention = CallingConvention.Cdecl", CharSet = CharSet.Unicode)]
public static extern int myfunc(string var1, int var2, out int var3, out byte[] var4);
この場合、FatalExecutionEngineError は返されず、関数はエラーなしで戻ります。しかし、戻り値は、関数で内部エラーが発生したことを示しています。(文字セットの変更によって FatalExecutionEngineError が防止される理由はわかりません。)
何が間違っているのかわかりません。助けてください。