无法注册事件,因为函数未标记为可序列化。无法将功能标记为可序列化

时间:2010-08-17 20:58:37

标签: .net events c++-cli

我有一个我想用作事件处理程序的函数:

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);

1 个答案:

答案 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);