我有一个我想用作事件处理程序的函数:
void singleFrameEventHandler(void) {
SetEvent(g_hSingleFrameArrived);
}
但是,当我尝试注册活动时:
iaframe->OnNewFrame += gcnew newFrame(&singleFrameEventHandler);
引发以下异常:
mscorlib.dll中出现未处理的“System.NotSupportedException”类型异常
其他信息:不支持全局方法的序列化(包括通过使用异步委托进行隐式序列化)。
有没有办法解决这个问题?
编辑:
我已经更改了代码,所以现在事件处理程序是类中的方法。但是,现在我得到了一个不同的例外:
mscorlib.dll中发生未处理的“System.Runtime.Serialization.SerializationException”类型异常
其他信息:无法找到程序集'BeamGage_Interface,Version = 1.0.3882.24450,Culture = neutral,PublicKeyToken = null'。
如果相关,则类定义如下所示:
[System::Serializable]
ref class FrameEventClass {
public:
FrameEventClass(const char *newId, IAFrame ^ frame) : id(newId) {
frame->OnNewFrame += gcnew newFrame(this, &FrameEventClass::frameEventHandler);
}
private:
const char *id;
void frameEventHandler(void) {
//Signal that the frame has arrived
SetEvent(g_hSingleFrameArrived);
//unregister for event
IAFrame ^ frame = /* Code to get handle to frame object */;
frame->OnNewFrame -= gcnew newFrame(this, &FrameEventClass::frameEventHandler);
return;
}
};
以下是我注册活动的方式:
gcnew FrameEventClass(id, iaframe);
答案 0 :(得分:1)
键入'FrameEventHandler'...不是 标记为可序列化
它不是指您的方法singleFrameEventHandler
,它指的是委托类型FrameEventHandler
。
在程序集public delegate void FrameEventHandler();
的代码中可能有BeamGage_Interface
行。
更新问题更新
从this page(找不到引用的msdn页面)
公共语言运行库没有 支持全球化的序列化 方法,所以委托不能使用 在其他方面执行全局方法 应用领域。
其他CLR语言(c#etc)不支持全局方法,因此您无法将它们与CLR一起使用。
你的解决方案(我相信)是在类中包装singleFrameEventHandler
(或者可能是g_hSingleFrameArrived
,我无法从你的片段中说出来)并传递实例方法。有点像(原谅我缺乏最近的c ++用法,我可能会犯错误)
class MyFrameEventHandler
{
public:
void singleFrameEventHandler(void){
SetEvent(g_hSingleFrameArrived);
}
}
// Usage
MyFrameEventHandler handler;
iaframe->OnNewFrame += gcnew newFrame(&handler.singleFrameEventHandler);