我正在实现一个具有多个AppDomains的应用程序。大部分跨域通信都是通过事件机制来完成的。除了那些EventArgs类包含带有setter的属性的事件之外,一切都运行得很好。以下是EventArgs类的示例:
[Serializable]
public class CancelableEventArgs : EventArgs
{
public bool Cancel { get; set; }
}事件已成功激发,但如果我在第二个订阅服务器( AppDomain )中设置了Cancel属性,则在事件执行结束后,该事件不会保留回第一个AppDomain (发布服务器)。这是故意设计的行为,还是我遗漏了什么?
发布于 2014-04-01 02:50:16
有两种类型的对象可以在AppDomains之间传递: serializable和MarshalByRefObject。
可序列化的对象(就像你文章中的EventArgs )在一个AppDomain中被序列化为代表对象的一些字节,并在另一个AppDomain中反序列化。这意味着另一个AppDomain接收原始对象的副本。
此外,继承MarshalByRefObject的对象可以在AppDomain之间通过引用传递。如果你继承了MarshalByRefObject而不是使你的对象可序列化,它可能会解决你的问题。
发布于 2014-04-01 16:52:03
我仍然希望有更好的方法来做到这一点,但这是我使用的变通方法:
[Serializable]
public class CancelableEventArgs : EventArgs
{
public MarshalByRefWrapper<bool> Cancel { get; set; }
}
public class MarshalByRefWrapper<T> : MarshalByRefObject
{
public T Value { get; set; }
}发布于 2014-11-18 23:01:33
我不完全理解它是如何工作的。但这里有两个项目:
从MarshalByRefObject继承的
在我看来,它只是传输数据,比如TypedDataSet和字符串
public class MyEventArgs : MarshalByRefWrapper<EventArgs>
{
public DataTable SystemState { get; set; }
public string SystemString { get; set; }
}
public class MarshalByRefWrapper<T> : MarshalByRefObject
{
public MarshalByRefWrapper()
{
}
public MarshalByRefWrapper(T value)
{
Value = value;
}
public T Value { get; set; }
public static implicit operator MarshalByRefWrapper<T>(T value)
{
return new MarshalByRefWrapper<T>(value);
}
}https://stackoverflow.com/questions/22766549
复制相似问题