簡體   English   中英

從主 AppDomain 訂閱 DomainUnload 事件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM