我想订阅位于单独进程中的MarshalByRefObject
上的事件。我试过了:
remoteObject.Progress += (sender, args) => { };
这引发了一个异常,因为lambda不可序列化:
System.Runtime.Serialization.Serialization异常:"Type"+<>程序集"…"中的c__DisplayClass3_0'未标记为可序列化。'
很明显,我无法将此编译器生成的类型标记为[Serializable]
。如何使用远程处理订阅事件?
正如@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
,它可以做任何您想做的事情。