我想我已经基本理解了如何编写回调函数的c#委托,但是这个让我很困惑。 C++的定义如下:用于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;
}
我得到了PInvokeStackInbalance
错误在哪里我叫_Initialize
行,如果我通过IntPtr.Zero
而不是委托,函数的定义修改为IntPtr
而不是CallbackDelegate
然后我收到一个AccessViolationException
。
'函数的参数的其余部分是字符串或整数“。不要隐藏信息。 –
你有没有试过不使用不安全?即:代表int CallbackDelegate(int lCode,int lParamSize,IntPtr pParam); – DougEC
@HansPassant我不是在试图隐藏信息,我试图离开我认为不相关的东西。我将编辑问题并添加信息。 – Valandur