我正在开发一款使用未托管dll的C#应用程序,其中一个方法需要将函数指针作为其参数之一。由于我无法访问未托管dll的实际C++源代码,因此我只能依靠我从使用相同dll的C++示例中得到的代码片段。我的问题是,我创建的委托无法传递到未托管方法中。
以下是我尝试使用的DllImport方法,它接受我创建的委托:
现在,在你建议我将委托的
以下是我尝试使用的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错误。代码片段使用大小为rev
的int *buf
数组。
使用上面的代码,当尝试回调时,应用程序会抛出AccessViolationException。我的预感是,我应该为ref int[] buf
参数使用不同的类型,但我已经尝试了我能想到的所有方法。我还一整天在Google、SO和MSDN上搜索,但没有找到任何线索。
有人有什么想法吗?
最后提一下,这是否与您可以将StringBuilder
用作参数的方式类似,通过一个接受char*
参数以检索可变长度字符串的非托管方法?