从C ++ / CLI钩住C#事件(Hooking a C# event from C++/CLI)

2019-10-18 19:08发布

所以我有一个具有以下事件C#类:

public class CSClient
{
   public delegate void OnMessageHandler(Object sender, EventArgs e);
   public event OnMessageHandler OnOptionsEvent;
}

然后,我有一个C ++ / CLI类,对此我想订阅OnOptionsEvent。

我已经试过这样的事情:

void CSClientWrapper::Start()
{
   GCHandle h = GCHandle::FromIntPtr(IntPtr(_impl));
   CSClient^ obj = safe_cast<CSClient^>(h.Target);

   __hook(&CSClient::OnOptionsEvent, obj, &CSClientWrapper::OnOptions);
}

void CSClientWrapper::OnOptions(Object^ sender, EventArgs^ args)
{
}

错误C2039:“add_OnOptionsEvent”:不是“CSClient”的成员

错误C2750:“CSClient :: OnMessageHandler”:不能用“新”的引用类型; 使用“gcnew”,而不是

我完全新的C ++ CLI,所以我怀疑这是一些真正的根本性我失踪。

Answer 1:

是的,这不是适当的语法。 最好忘记__hook关键字存在,它是一个相当错误的想法,事件处理语法添加到本地C ++。 您需要创建一个托管委托认购的情况下,正确的语法应接近:

   CSClient^ obj = safe_cast<CSClient^>(h.Target);
   obj->OnOptionsEvent += 
      gcnew CSClient::OnMessageHandler(this, &CSClientWrapper::OnOptions);


文章来源: Hooking a C# event from C++/CLI
标签: c# c++-cli