我正在实施一个包含多个AppDomain的应用程序。大多数跨域通信是通过使用事件机制完成的。除了那些EventArgs类包含带有setter的属性的事件外,一切都运行良好。以下是EventArgs类的示例:
[Serializable]
public class CancelableEventArgs : EventArgs
{
public bool Cancel { get; set; }
}
事件成功触发,但如果我在第二个AppDomain(订阅者)中设置了Cancel属性,则在事件执行结束后,它不会持久保存回第一个AppDomain(发布者)。这种行为是设计的,还是我错过了什么?
答案 0 :(得分:1)
可以在AppDomains之间传递两种对象:serializable和MarshalByRefObject。
可序列化对象(如帖子中的EventArgs)在一个AppDomain中序列化为某些字节表示对象,并在其他AppDomain中反序列化。这意味着其他AppDomain会收到原始对象的副本。
此外,继承MarshalByRefObject的对象可以通过AppDomain之间的引用传递。如果继承MarshalByRefObject而不是使对象可序列化,它可能会解决您的问题。
答案 1 :(得分:1)
我不太了解它的工作原理。 但有两个项目:
在我看来,它转向传输数据,例如TypedDataSet和string
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);
}
}
答案 2 :(得分:0)
仍然希望有更好的方法来做到这一点,但这是我使用过的解决方法:
[Serializable]
public class CancelableEventArgs : EventArgs
{
public MarshalByRefWrapper<bool> Cancel { get; set; }
}
public class MarshalByRefWrapper<T> : MarshalByRefObject
{
public T Value { get; set; }
}