4

「混合」クラスインスタンスからメソッドを指す.NETデリゲートを初期化する方法はありますか?

次のようにC++クラスを「混合」しました:

class CppMixClass
{
public:
    CppMixClass(void){
        dotNETclass->StateChanged += gcnew DotNetClass::ServiceStateEventHandler(&UpdateHealthState);
    }
   ~CppMixClass(void);
   void UpdateState(System::Object^ sender, DotNetClass::StateEventArgs^ e){
       //doSmth
   }
}

DotNetClassはC#で実装、メソッド宣言はデリゲートでOK。この行はエラーを生成します:

dotNETclass->StateChanged += gcnew DotNetClass::ServiceStateEventHandler(&UpdateHealthState);
error C2276: '&' : illegal operation on bound member function expression

誰でも問題についての手がかりを持っていますか? CppMixClass クラスは純粋な .NET (ref) クラスではないのでしょうか?

UpdateHealthState が静的メソッドの場合にこれを機能させましたが、インスタンス メソッドへのポインターが必要です。

私は次のように試してみました:

dotNETclass->StateChanged += gcnew DotNetClass::ServiceStateEventHandler(this, &UpdateHealthState);

しかし、これは明らかに機能しません。これは、.NET (ref) クラス (System::Object) へのポインター (ハンドル) ではないためです。

ServiceStateEventHandler は C# で次のように定義されています。

public delegate void ServiceStateEventHandler(object sender, ServiceStateEventArgs e);

これを読んでくれてありがとう:)

4

2 に答える 2

5

私はこれに対する答えを見つけました(もちろん、Nishant Sivakumarによると、男性は私のC ++ / CLI相互運用関連の問題すべてに対する答えを持っているようです):

http://www.codeproject.com/KB/mcpp/CppCliSupportLib.aspx?display=印刷

回答は、ネイティブ クラスのデリゲートのマクロが定義されている "msclr/event.h" ヘッダーにあります。

ニッシュのコードは次のとおりです。

class Demo5
{
msclr::auto_gcroot<FileSystemWatcher^> m_fsw;
public:
// Step (1)
// Declare the delegate map where you map
// native method to specific event handlers

BEGIN_DELEGATE_MAP(Demo5)
    EVENT_DELEGATE_ENTRY(OnRenamed, Object^, RenamedEventArgs^)
END_DELEGATE_MAP()

Demo5()
{
    m_fsw = gcnew  FileSystemWatcher("d:\\tmp");
    // Step (2)
    // Setup event handlers using MAKE_DELEGATE
    m_fsw->Renamed += MAKE_DELEGATE(RenamedEventHandler, OnRenamed);
    m_fsw->EnableRaisingEvents = true;
}
// Step (3)
// Implement the event handler method

void OnRenamed(Object^, RenamedEventArgs^ e)
{
    Console::WriteLine("{0} -> {1}",e->OldName, e->Name);
}
};
于 2009-01-08T21:05:46.453 に答える
3

イベントを使用できるのは .NET タイプのみです。イベントを処理する新しいマネージド クラスを作成し、そのクラスを CppMixClass 内に構成し、構築中に CppMixClass へのポインターを渡すことをお勧めします。マネージ イベント処理クラスは、イベントを処理するときに CppMixClass の関数を呼び出すことができます。

于 2009-01-08T20:54:47.147 に答える