1

dllimportを介してc++メソッドを呼び出す必要があります。c ++メソッドに次の2つのパラメーターがない限り、すべてが正常に機能しています。

const void * key,
void * out

私はそれらをマーシャリングする必要があると思います。しかし、それはどのように機能しますか?キーはバイト配列へのポインタである必要があり、outパラメータも長さが16のバイト配列です。

Jclが提案することを試した後、私は次のようになりました。

最初の方法(out byte [] outprmを使用)を使用すると、プログラムはエラーなしでクラッシュします(呼び出しポイントに到達したとき)。しかし、2番目の方法(Jclのコメントから)を使用すると、次のようになります。

[DllImport(@"MyDLL.dll", SetLastError = true)]
public static extern void MyMethod(IntPtr key, out IntPtr outprm); 

private void button1_Click(object sender, EventArgs e)
    {            
        byte[] hash = new byte[16];
        byte[] myArray = new byte[] { 1, 2, 3 };
        IntPtr outprm = Marshal.AllocHGlobal(hash.Length);
        IntPtr key = Marshal.AllocHGlobal(myArray.Length);
        Marshal.Copy(myArray, 0, key, myArray.Length);
        MyMethod(key, out outprm);
        Marshal.Copy(outprm, hash, 0, 16);
        Marshal.FreeHGlobal(key);                       
    }

これで、MyMethodを呼び出すときにエラーは発生しません。データをコピーして戻そうとすると、次のエラーが発生します:AccessViolationException

保護されたメモリに書き込みたいとのことでした。dllとc#ソフトウェアはx64です(x64である必要があります)。多分これが理由ですか?

4

1 に答える 1

4

キーとアウトの両方に使用IntPtrします。次のようになります。

[DllImport ("whatever.dll")]
public static extern void MyMethod(IntPtr key, IntPtr outprm);

バイト配列でkeyあると見なして、IntPtrになるには、次のようにします。myArray

IntPtr key = Marshal.AllocHGlobal(myArray.Length);
Marshal.Copy(myArray, 0, key, myArray.Length);
// ... call your function ...
Marshal.FreeHGlobal(key );

から16バイト配列を取得するにはoutprm

IntPtr outprm;
MyMethod(key, outprm);
byte [] myArray = new byte[16];
Marshal.Copy(outprm, myArray, 0, 16);    
于 2012-09-06T14:42:24.650 に答える