Не удается зарегистрироваться на событие, потому что функция не помечена как сериализуемая. Не могу пометить функцию как сериализуемую - PullRequest
1 голос
/ 18 августа 2010

У меня есть функция, которую я хочу использовать в качестве обработчика события:

void singleFrameEventHandler(void) {
    SetEvent(g_hSingleFrameArrived);
}

Однако, когда я пытаюсь зарегистрироваться для события:

iaframe->OnNewFrame += gcnew newFrame(&singleFrameEventHandler);

Следующее исключениеповышено:

Произошло необработанное исключение типа 'System.NotSupportedException' в mscorlib.dll

Дополнительная информация: Сериализация глобальных методов (включая неявную сериализацию с использованием асинхронных делегатов)не поддерживается.

Есть ли способ обойти это?


Редактировать:

Я изменил код, поэтому теперь обработчик событийметод в классе.Однако теперь я получаю другое исключение:

Необработанное исключение типа 'System.Runtime.Serialization.SerializationException' произошло в mscorlib.dll

Дополнительная информация: Невозможно найти сборку'BeamGage_Interface, версия = 1.0.3882.24450, культура = нейтральная, 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 Ответ

1 голос
/ 18 августа 2010

Тип 'FrameEventHandler' ... не помечены как сериализуемые

Это не относится к вашему методу singleFrameEventHandler, это относится к типу делегата FrameEventHandler.

Возможно, что-то вроде public delegate void FrameEventHandler(); в коде для сборки BeamGage_Interface.

обновление для обновления вопроса
Начиная с этой страницы (не удается найти указанную страницу msdn)

Общая языковая среда выполнения не поддержка сериализации глобальных методы, поэтому делегаты не могут быть использованы выполнять глобальные методы в других домены приложений.

Другие языки CLR (c # и т. Д.) Не поддерживают глобальные методы, поэтому их нельзя использовать с CLR.

Ваше решение (я считаю) состоит в том, чтобы обернуть singleFrameEventHandler (или, может быть, g_hSingleFrameArrived, я не могу сказать из ваших фрагментов) в классе и вместо этого передать метод экземпляра. Что-то вроде (простите, что я недавно не использовал c ++, я могу ошибаться)

class MyFrameEventHandler
{
    public:
        void singleFrameEventHandler(void){
            SetEvent(g_hSingleFrameArrived);
        }
}
// Usage
MyFrameEventHandler handler;
iaframe->OnNewFrame += gcnew newFrame(&handler.singleFrameEventHandler);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...