簡體   English   中英

為什么在使用對象遠程處理MarshalByRefObj時使用委托?

[英]Why use delegates when using object remoting MarshalByRefObj?

我的應用程序允許插件,我有一個Core類(MarshalByRefObj)插件必須繼承,這個類提供各種功能。 現在我的問題是,當這個類在主應用程序域上實例化並傳遞給不同應用程序域中的插件時,在這種情況下使用委托會有什么好處:

public class Core : MarshalByRefObject
{
    public void DoSomething()
    {
         MyMainApp.Delegate1("SomeMethod", "Test");
    }
}

如您所見,我的核心類在MyMainApp上調用委托方法。 我也可以做MyMainApp.SomeMethod("test")

然而,在許多關於遠程處理和插件系統如何工作的在線示例中,每個人似乎都在使用代理。 這有什么具體原因嗎? 有人能給我一個更實際的例子嗎?

大多數情況下,用戶界面中的控件是由主線程創建的,除非您有意在另一個線程中創建它們。 這是重要的一點: 只有創建控件的線程才能訪問該控件。

如果直接調用DoSomething ,並且DoSomething代碼想要與UI控件進行交互,則不會允許它,並且您將獲得異常。 MyMainApp.Delegate1("DoSomething"相當於: 請在主線程上執行指定的方法。現在它可以訪問UI控件。

還有其他原因,但這是最重要的一點要記住。 有關更多信息,請參閱MSDN

其中一個好處是傳遞給MyMainApp.Delegate1的信息被序列化,以便從插件appdomain傳輸到main-appdomain。 Delegate1方法將在主域中執行DoSomething 它們不共享內存(因此不能直接訪問對象實例)。 因此,您可以在其他應用程序域上動態運行方法。 如果它是通過反射完成的,那么插件可能能夠運行未列出的方法。

我寧願不使用這種類型的構造,因為沒有對調用方法的編譯時檢查。 我寧願使用衛星組件中的接口。 (以防止主應用程序域獲得對/加載插件程序集的引用,因此無法再卸載)


另一件事:如果你直接調用MyMainApp.SomeMethod("test") 這意味着插件必須知道插件加載器的定義。 這意味着你得到了一個緊密耦合(從插件)到'父'應用程序(s版本)。 這使得整個插件結構“無用”。 您可以通過在MyMainApp上實現一個ISupportSomeMethod接口來解決這個問題,該接口是在插件的mainapp使用的衛星程序集中定義的。 如果您的MyMainApp未實現ISupportSomeMethod接口,則該插件與該程序不兼容。 這樣您的MyMainApp可以支持多種插件結構。


在這種情況下,您更喜歡事件結構。 因為子對象想要觸發它的父對象的方法。 太糟糕的跨域事件調用沒有用,因為您的主模塊將加載程序集並且無法卸載它。 你可以寫一個proxi類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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