从C ++ / CLI挂钩C#事件

时间:2013-10-15 16:40:37

标签: c# c++-cli

所以我有一个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':无法使用'new'   参考类型;使用'gcnew'代替

我对C ++ CLI完全不熟悉,所以我怀疑这是一个非常重要的东西。

1 个答案:

答案 0 :(得分:3)

是的,这不是合适的语法。最好忘记__hook关键字存在,将事件处理语法添加到本机C ++是一个相当错误的想法。您需要创建一个托管委托来订阅该事件,正确的语法应该接近:

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