1

したがって、次のイベントを持つ C# クラスがあります。

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

次に、OnOptionsEvent にサブスクライブしたい C++/CLI クラスがあります。

私はこのようなことを試しました:

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 にまったく慣れていないので、本当に基本的なことが欠けていると思います。

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 に答える