任何想法如何初始化指向“混合”类实例的方法的.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#中实现,方法声明与委托一起使用。 此行生成错误:
dotNETclass->StateChanged += gcnew DotNetClass::ServiceStateEventHandler(&UpdateHealthState);
error C2276: '&' : illegal operation on bound member function expression
任何人都有关于问题的线索? 也许coz 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);
Thanx阅读此内容:)
答案 0 :(得分:5)
我刚刚找到答案(当然是Nishant Sivakumar,人似乎对我所有的C ++ / CLI互操作相关问题都有答案):
http://www.codeproject.com/KB/mcpp/CppCliSupportLib.aspx?display=Print
答案位于“msclr / event.h”标题中,其中定义了本机类中委托的宏。
Nish的代码如下:
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);
}
};
答案 1 :(得分:3)
只有.NET类型才能使用事件。我建议创建一个处理事件的新托管类,并在CppMixClass中组成该类,并在构造期间向它传递一个指向CppMixClass的指针。然后,托管事件处理类可以在处理事件时调用CppMixClass上的函数。