1

所以我有一个具有以下事件的 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 完全陌生,所以我怀疑这是我所缺少的一些非常基本的东西。

4

1 回答 1

3

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

   CSClient^ obj = safe_cast<CSClient^>(h.Target);
   obj->OnOptionsEvent += 
      gcnew CSClient::OnMessageHandler(this, &CSClientWrapper::OnOptions);
于 2013-10-15T16:53:28.883 回答