在C ++中调用两个函数并在C#中传递相同的委托

时间:2012-02-17 12:17:35

标签: .net delegates marshalling

我有C ++项目的功能:

_API void __stdcall  InstallMailHandler(MailHdlPtrType Hdl)
{ ... }
_API void __stdcall  UninstallMailHandler(MailHdlPtrType Hdl)
{ ... }

typedef void (STDCALL  *MailHdlPtrType)(unsigned char instNo, bla bla bla);

我有C#:

public static extern void InstallMailHandler(MailHdlPtrType Hdl);
public static extern void UninstallMailHandler(MailHdlPtrType Hdl);

public delegate void MailHdlPtrType(byte instno, bla bla bla);

但是当我从C#调用InstallMailHandler和UninstallMailHandler并在参数中使用相同的函数时,它会导致C ++中的地址不同,因此无法卸载以前安装的邮件处理程序。

是否有可能以某种方式确保两个调用都会产生相同的函数地址,或者可能明确地设置一个地址?

1 个答案:

答案 0 :(得分:1)

我认为问题是每个调用都会创建新的委托对象。

你可能会这样称呼它们:

InstallMailHandler(new MailHdlPtrType(YourCoolFunction));
// ...
UninstallMailHandler(new MailHdlPtrType(YourCoolFunction));

或以等效的简短形式:

InstallMailHandler(YourCoolFunction);
// ...
UnnstallMailHandler(YourCoolFunction);

我认为你只需要保持同一个代表:

MailHdlPtrType my_deleg = new MailHdlPtrType(YourCoolFunction); // this may be field in your class or something
//...
InstallMailHandler(my_deleg);
// ...
UnnstallMailHandler(my_deleg);