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である必要があります)。多分これが理由ですか?