3

私は、パラメーターの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*

4

1 に答える 1

4

配列を前後に渡すことは常にPITAです...この署名を試してください、それは適用できるようです:

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void point_handle(
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)]
    int[] buf,
    int rev,
    IntPtr pParam);

編集:詳しく説明すると、「Cスタイル」の配列(つまりT *)と、引数で指定された長さの両方がある場合、SizeParamIndexが救済になります。基本的には、「長さ不明の配列が入ってくるのですが、このインデックスのパラメーターは、それらの数を示します。それとタイプの両方を使用して、マーシャリングを支援してください」と書かれています。

于 2012-12-31T23:05:01.547 に答える