从C ++ / CLI挂钩C#事件 [英] Hooking a C# event from C++/CLI

查看:177
本文介绍了从C ++ / CLI挂钩C#事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我有一个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)
{
}
pre>


错误C2039:'add_OnOptionsEvent':不是'CSClient'的成员



错误C2750:'CSClient :: OnMessageHandler':不能在
引用类型上使用'new'使用'gcnew'代替


我完全是新的C ++ CLI,所以我怀疑这是一个真正的根本缺少。

解决方案

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

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


So I have a C# class that has the following event:

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

Then I have a C++/CLI class, for which I want to subscribe to OnOptionsEvent.

I have tried something like this:

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)
{
}

error C2039: 'add_OnOptionsEvent' : is not a member of 'CSClient'

error C2750: 'CSClient::OnMessageHandler' : cannot use 'new' on the reference type; use 'gcnew' instead

I am completely new to C++CLI, so I suspect it is something really fundamental that I'm missing.

解决方案

Yes, that's not appropriate syntax. Best to forget that the __hook keyword exists, it was a fairly mistaken idea to add event handling syntax to native C++. You need to create a managed delegate to subscribe the event, correct syntax should be close to:

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

这篇关于从C ++ / CLI挂钩C#事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆