.NET Remoting сериализует делегат на основе лямбда-выражений - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу подписаться на событие на MarshalByRefObject, которое происходит в отдельном процессе. Я попробовал:

remoteObject.Progress += (sender, args) => { };

Это вызывает исключение, потому что лямбда не сериализуема:

System.Runtime.Serialization.SerializationException: 'Тип' ... + <> c__DisplayClass3_0 'в сборке' ... 'не помечен как сериализуемый.'

Я не могу отметить этот тип, сгенерированный компилятором [Serializable]. Как я могу подписаться на событие, используя Remoting?

1 Ответ

0 голосов
/ 12 ноября 2018

Как подсказывает @Alejandro в комментариях, возможный обходной путь - создать класс.Я построил это решение:

class DelegateAdapter<T> : MarshalByRefObject
{
    Action<T> localHandler;

    public DelegateAdapter(Action<T> localHandler)
    {
        this.localHandler = localHandler;
    }

    public void RemoteHandler(T value) => localHandler(value);
}

И его можно использовать так:

[Serializable]
delegate void MyCustomDelegate(SomeType arg);

MyCustomDelegate dlg = new DelegateAdapter<SomeType>(arg => { ... }).RemoteHandler;

Делегат является сериализуемым.Его цель - MarshalByRefObject в вызывающем процессе, который может делать все, что вы захотите.

...