2012-10-05 21 views
3

不確定在這裏使用的確切條款,所以任何幫助,將不勝感激。如何在C#中創建可插拔的GUI和DLL#

爲了最簡單,我有一個表單應用程序。當我加載「form.exe」時,表單有一個控件,一個菜單。該菜單有一個菜單項「退出」。我想要的是,當表單加載時,能夠傳遞參數到這個表單應用程序,指定DLL,可以添加專門的方法,控件等。

現在,當我加載「form.exe add_plugable.dll 「,我的菜單有另一個菜單項」添加「。 當我加載「form.exe add_plugable.dll remove_pluggable.dll」時,菜單中有3項「退出」,「添加」和「刪除」。

希望這是有道理的。我需要在Forms應用程序中包含什麼,以及如何創建我的DLL?我知道我需要一個通用的接口,但不知道如何用名稱空間和接口以及抽象類來完成這個任務。

謝謝!

回答

5

我會建議看看Managed Extensibility Framework。它是爲這種確切類型的場景而設計的。

例如,Visual Studio使用它的可擴展性,因此可以在運行時動態發現並插入添加項。

+0

當我升級到VS 2010時,這可能會是我的解決方案。但即時通訊在2008年和使用.Net 3.5。 – Tizz

+0

@Tizz從CodePlex網站上抓取它。在.NET 3.5中完美工作:http://mef.codeplex.com/releases/view/40606 –

+0

我實際上也發現了這個教程(作爲參考添加):http://www.c-sharpcorner.com/uploadfile/rmcochran /plug_in_architecture09092007111353am/plug_in_architecture.aspx – Tizz

4

您可以使用預先編寫的框架,但如果你正在尋找一個「裸露的骨頭」的解決方案,試試這個:

  1. 創建一個接口(或一組接口,如果你喜歡),它包含表單應用程序將調用的所有方法,例如IPlugin。把接口放在一個單獨的類庫中。
  2. 在每個插件DLL中,創建一個實現IPlugin的公共類。
  3. 在表單應用中,決定加載哪些插件以及何時調用它們。這個邏輯完全取決於你。

加載一個像這樣的插件,然後調用接口成員來完成你想要的。您可以從app.config(一個數據庫)讀取插件文件和類名,或者根據您的要求通過命名約定計算它們。

var pluginAssembly = Assembly.Load(pluginFileName); 
var plugin = (IPlugin) pluginAssembly.CreateInstance(pluginClassName); 

這些方法有幾個重載允許更多的過程控制。例如,您可以使用AssemblyName加載插件程序集,而不是簡單的字符串。在實例化類時,可以指定綁定標誌和一組參數值以傳遞給類的構造函數。

+0

偉大的幫助。希望我可以多次投票。 – dotNET

+0

有一個問題。這是否允許我能夠簡單地將一個新的DLL(包含一個實現'IPlugin'的類)放到應用程序目錄中並讓我的應用程序在下次加載時自動發現它?由於新的插件DLL將在稍後添加到目錄中,因此我將不會爲上面提到的「pluginClassName」參數賦值。如何解決這個問題?以及如何知道某個特定的DLL是否包含實現「IPlugin」的類? – dotNET

+0

'Assembly.Load'只會在您第一次調用DLL時發現您的DLL,因此您可以隨時將它們放入目錄中,然後再嘗試加載它們。加載後,程序集將在AppDomain的生命週期內緩存在內存中。要刷新緩存,請回收AppDomain。 –