2014-03-31 50 views
0

我正在實施具有多個AppDomain的應用程序。大多數跨域通信是通過使用事件機制完成的。除了那些EventArgs類包含setter屬性的事件以外,一切工作都很好。這裏是EventArgs類的例子:Cross AppDomain「可取消」事件

[Serializable] 
public class CancelableEventArgs : EventArgs 
{ 
    public bool Cancel { get; set; } 
} 

事件是成功地發射,但是如果我設置在第二的AppDomain(用戶)Cancel屬性,它不是事件執行後,堅持回到了第一的AppDomain(出版商)結束。這是行爲的設計,還是我錯過了什麼?

回答

0

有兩種可以在AppDomain之間傳遞的對象:serializable和MarshalByRefObject。

可序列化對象(如帖子中的EventArgs)在一個AppDomain中序列化爲一些字節表示對象,並在另一個AppDomain中反序列化。這意味着另一個AppDomain收到原始對象的副本

此外,繼承MarshalByRefObject的對象可以在AppDomain之間通過引用傳遞。如果您繼承MarshalByRefObject而不是使對象可序列化,那麼它可能會解決您的問題。

0

還是希望有這樣的一些更好的方法,但是這是我用過的解決方法:

[Serializable] 
public class CancelableEventArgs : EventArgs 
{ 
    public MarshalByRefWrapper<bool> Cancel { get; set; } 
} 

public class MarshalByRefWrapper<T> : MarshalByRefObject 
{ 
    public T Value { get; set; } 
} 
0

我不太完全瞭解它是如何工作的。 但也有兩個項目:

  1. 繼承自MarshalByRefObject(跨域)
  2. 爲EventArgs的(對於事件處理程序)

在我隱式操作原來傳輸數據,如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); 
    } 
} 
+1

請添加解釋您的答案是如何工作的,而不僅僅是代碼。 –