私は、パラメーターの1つとして関数ポインターを受け取るメソッドとしてアンマネージdllを使用するC#アプリケーションに取り組んでいます。アンマネージdllの実際のC++ソースコードにアクセスできないため、同じdllを使用するC++サンプルからのスニペットのみに依存できます。私が抱えている問題は、アンマネージメソッドに渡すために作成したデリゲートが機能していないことです。
以下は、私が作成したデリゲートを取得する、使用しようとしているメソッドのDllImportです。
[DllImport("pos_tk.dll")]
static internal extern ErrorCode AddSIGHandle([MarshalAs(UnmanagedType.FunctionPtr)] SIG_Callback func);
これが私が現在持っているデリゲート署名です:
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void SIG_Callback ([MarshalAs(UnmanagedType.LPArray)] ref int[] buf, int rev, object sender);
そして、これはC++サンプルスニペットが使用する関数です。
void __stdcall point_handle (int *buf, int rev, LPVOID pParam)
ref int[] buf
さて、プログラムへのデリゲートのパラメータを変更するように指示する前にref int buf
、コールバックが試行されると、InvalidVariantエラーがスローされます。コードスニペットはint *buf
、サイズの配列として使用しますrev
。
上記のコードを使用すると、コールバックが試行されると、アプリケーションはAccessViolationExceptionをスローします。私の勘では、ref int[] buf
パラメーターに別のタイプを使用する必要がありますが、考えられるすべてのことを試しました。私も一日中グーグル、SO、MSDNを検索してきましたが、運がありませんでした。
誰かアイデアはありますか?
最後に、これは、可変長の文字列を取得するためにパラメーターをStringBuilder
受け取るアンマネージメソッドのパラメーターとしてを使用する方法と似ていますか?char*