我想我已经基本了解了如何为回调编写 c# 委托,但这让我感到困惑。c++定义如下:
typedef int (__stdcall* Callback)(
long lCode,
long lParamSize,
void* pParam
);
我的 c# 方法是:
unsafe delegate int CallbackDelegate (int lCode, int lParamSize, IntPtr pParam);
虽然这似乎是不正确的,因为我收到了 PInvokeStackInbalance 错误,这意味着我对委托的定义是错误的。
该函数的其余参数是字符串或整数,这意味着它们不会导致错误,如果我只传递一个 IntPtr.Zero 而不是委托(这意味着我指向一个不存在的回调函数)我收到一个 AccessViolation 错误,这也很有意义。
我究竟做错了什么?
编辑:
完整的 c++ 函数是:
int
__stdcall
_Initialize (
const char* FileName,
Callback cbFunction,
int Code,
const char* Name,
unsigned int Option,
unsigned int Option2
);
我的 C# 版本是:
[DllImport("MyDll.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int _Initialize (string FileName, CallbackDelegate cbFunction, int Code, string Name, uint Options, uint Options2);
该函数(用于测试)只是在控制台应用程序的主例程中调用:
static void Main(string[] args)
{
CallbackDelegate del = new CallbackDelegate(onCallback);
Console.Write(_Initialize("SomeFile.dat", del, 1000, "", 0, 4));
Console.Read();
}
这是哪里onCallback
:
static int onCallback(int lCode, int lParamSize, IntPtr pParam)
{
return 0;
}
如果我通过 a而不是委托,PInvokeStackInbalance
我在调用的行上收到错误,并将函数的定义更改为,而不是然后我得到 a 。_Initialize
IntPtr.Zero
IntPtr
CallbackDelegate
AccessViolationException