1

我需要通过 dllimport 调用一个 c++ 方法。只要 c++ 方法中没有以下两个参数,一切正常:

const void * key,
void * out

我想我需要整理他们。但它是如何工作的?key 应该是一个指向字节数组的指针,out 参数也是一个长度为 16 的字节数组。

在尝试了 Jcl 的建议后,我有以下内容:

使用第一种方法(使用 out byte[] outprm),程序崩溃而没有错误(到达调用点时)。但是使用第二种方式(来自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 回答