![](/img/trans.png)
[英]AppDomain.CurrentDomain.DomainUnload not be raised in Console app
[英]Subscribe to DomainUnload event from a main AppDomain
我正在創建一個應用程序,它與一個可以創建和卸載的新 AppDomain 一起使用。 我想處理 DomainUnload 事件,所以我需要訂閱它。 我無法從可以卸載的新 AppDomain 訂閱此事件,因為卸載域后將無法訪問那里的所有成員。
但是當我嘗試從 Main AppDomain 訂閱此事件時,我總是收到異常:“ System.Runtime.Serialization.SerializationException: Type 'MyNamespace.MainWindow' in assembly 'MyMainAssembly' 未標記為可序列化。 ”
最初,我嘗試向主應用程序域中的類添加一個屬性 [Serializable],但沒有幫助。 然后我創建了一個從 MarshalByRefObject 派生的新類“RemoteHandlerClass”並將訂閱代碼放入其中,但我也遇到了同樣的錯誤。 在這個類中使用 [Serializable] 屬性也沒有幫助。 要訪問此類中的成員,我在主應用程序域中使用代理對象,由以下人員創建:
var remoteHandler = (RemoteHandlerClass)workerDomain.CreateInstanceAndUnwrap(
typeof(RemoteHandlerClass).Assembly.FullName, typeof(RemoteHandlerClass).FullName);
我如何訂閱此活動? 最好我想從主應用程序域訂閱此事件。 下面的代碼可以重現我的問題。
謝謝!
public partial class MainWindow : Window
{
private void Button_Click(object sender, RoutedEventArgs e)
{
var newDomain = AppDomain.CreateDomain("New domain");
newDomain.DomainUnload += UnloadHandler; // System.Runtime.Serialization.SerializationException:
// Type 'MyNamespace.MainWindow' in assembly 'MyMainAssembly'
// is not marked as serializable.
}
private void UnloadHandler(object sender, EventArgs e)
{
}
}
因此,在處理 AppDomains 時,您的處理程序對象需要是MarshalByRefObject
而不是——它只是一個 Window 類型。 將您正在做的事情包裝在一個簡單的類中,例如
class DomainContainer : MarshalByRefObject
{
public void StartDomain()
{
var newDomain = AppDomain.CreateDomain("New domain");
newDomain.DomainUnload += UnloadHandler;
}
private void UnloadHandler(object sender, EventArgs e)
{
}
}
並在您的應用程序中調用它。
private void Button_Click(object sender, RoutedEventArgs e)
{
var d = new DomainContainer();
d.StartDomain();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.