相关疑难解决方法(0)

用于C++回调的C#委托

我想我基本上已经理解了如何为回调编写c#delegates,但是这个让我很困惑.c ++定义如下:

typedef int (__stdcall* Callback)(
long lCode,
long lParamSize,
void* pParam 
);
Run Code Online (Sandbox Code Playgroud)

我的c#方法是:

 unsafe delegate int CallbackDelegate (int lCode, int lParamSize, IntPtr pParam);
Run Code Online (Sandbox Code Playgroud)

虽然这似乎是不正确的,因为我得到一个PInvokeStackInbalance错误,这意味着我对委托的定义是错误的.

函数的其余参数是字符串或整数,这意味着它们不会导致错误,如果我只是传递一个IntPtr.Zero而不是委托(这意味着我指向一个不存在的回调函数)我得到一个AccessViolation错误,这也是有意义的.

我究竟做错了什么?

编辑:

完整的c ++功能是:

int
__stdcall
_Initialize (
const char*         FileName,
Callback            cbFunction,
int                 Code,
const char*         Name,
unsigned int        Option,
unsigned int        Option2
);
Run Code Online (Sandbox Code Playgroud)

我的c#版本是:

[DllImport("MyDll.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int _Initialize (string FileName, CallbackDelegate cbFunction, int Code, string Name, uint Options, uint Options2);
Run Code Online (Sandbox Code Playgroud)

该函数是(用于测试)刚刚在控制台应用程序的主例程中调用:

static void Main(string[] args)
{
    CallbackDelegate …
Run Code Online (Sandbox Code Playgroud)

c# c++ delegates callback dllimport

11
推荐指数
2
解决办法
1万
查看次数

固定一个功能指针

我需要将托管回调传递给非托管TCP接收器.由于它是一个需要在应用程序的生命周期中存在的线程,我需要防止它被垃圾收集.我到处都读到不需要固定函数指针,GCHandle.Alloc将完成阻止垃圾收集的工作.

但这是给定的吗?我已经看到托管此代码的AppPool因访问冲突而崩溃.为什么我不怀疑发生此错误的事实是因为函数指针被垃圾收集了?

这篇文章支持这一事实.

更新:这似乎大大减少了崩溃.这种方法有问题吗?

typedef void (__cdecl *ProcMessageFunc)(void* param, void* paramBuf, ULONG bufSize);
FuncDelegate^ fp = gcnew MessageFuncDelegate(this, &Handler); 
pin_ptr<MessageFuncDelegate^> pinnedFunctionPointer = &fp; 
ret = Receiver ((ProcMessageFunc)pinnedFunctionPointer);
Run Code Online (Sandbox Code Playgroud)

c# interop c++-cli

8
推荐指数
1
解决办法
3053
查看次数

标签 统计

c# ×2

c++ ×1

c++-cli ×1

callback ×1

delegates ×1

dllimport ×1

interop ×1