从C ++ / CLI挂钩C#事件 [英] Hooking a C# event from C++/CLI
问题描述
所以我有一个C#类,有以下事件:
public class CSClient
{
public delegate void OnMessageHandler(Object sender,EventArgs e);
public event OnMessageHandler OnOptionsEvent;
}
然后我有一个C ++ / CLI类,我想订阅OnOptionsEvent。
我试过这样的:
void CSClientWrapper :: Start()
pre>
{
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,所以我怀疑这是一个真正的根本缺少。
解决方案是的,这不是合适的语法。最好忘记__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屋!