4

アンマネージDLLからC#に関数をインポートしています。C++関数のシグネチャは次のとおりです

int RF_PowerOnEx(int nDev, int nCardType, DWORD* pdwRXSize, BYTE* lpbRXData)

次のようにインポートしています

[DllImport("TP9000.dll")]
public static extern int RF_PowerOnEx(int nDev, int nCardType, out int pdwRXSize, out byte[] lpbRXData);

ただし、そうするとSystem.AccessViolationExceptionが発生します。この特定の関数を除く他の関数を正常にインポートしました。pdwRXSizeとlpbRXDataの両方が出力として扱われます。整数とバッファが初期化されてから、関数に渡され、関数がバッファをいっぱいにします。ヘルプ!!!!入力パラメータをDLLに渡すことはできるようですが、出力パラメータを取得できません。Stringbuilderオブジェクトを渡してみましたが無駄になりました。誰か助けてもらえますか?ありがとう!

編集:タイプミス

4

3 に答える 3

2

このように管理された署名を宣言することをお勧めします

public static extern int RF_PowerOnEx(int nDev, int nCardType, out int pdwRXSize, [out] IntPtr lpbRXData);

次に、で設定する必要のある長さ情報を使用して、アンマネージメモリから直接「手動で」バイト配列をマーシャリングしますpdwRXSize

あなたは本当に関数の実装についてもっと知る必要があります:特に、呼び出し元はデータバッファを含むメモリを解放するために何かをすることになっていますか?

于 2012-06-14T13:07:42.087 に答える
1

out byte[]BYTE**と同等ではありません。単なるbyte[]にします。そして、pdwRXSizeはref、配列のサイズに設定します。このように呼んでください:

byte[] buffer = new byte[666];
int size = buffer.Length;
int retval = RF_PowerOnEx(device, cardtype, ref size, buffer);
if (retval == okay) processData(buffer, size);

必要な配列サイズについて、知識に基づいて推測する必要があります。

于 2012-06-14T13:45:07.217 に答える
0

EntryPointNotFoundException.NET宣言の名前がアンマネージ宣言に適合しないためにスローされます(アンダースコアのため)。

試す:

    [DllImport("TP9000.dll", EntryPoint = "RF_PowerOnEx")]
    public static extern int RFPowerOnEx(int nDev, int nCardType, out int pdwRXSize, out byte[] lpbRXData);
于 2012-06-14T12:54:53.037 に答える