2011-01-20 102 views
8

我有一個程序,我開發使用基本的插件架構。實際上,當程序加載時,它使用反射來搜索適合某個接口的dll的目錄,然後加載它們。 現在看來,目前的插件列表是所有將被使用的。C#DLL的插件架構

因此,我目前的做法是檢查dll文件還是最佳做法,還是有更好的方法來加載每個dll?

感謝。

+0

你能用你的示例代碼來澄清一下你的問題嗎?我問這是因爲我已經開發了一個非常類似的插件體系結構,它正在掃描插件目錄中的dll。如果我們能看到你的相關資料,我想我們可以提供建議。 – HuseyinUslu 2011-01-20 14:05:24

回答

14

從您的問題看,您似乎已經構建(或正在嘗試構建)您自己的插件架構。它不是一個好主意,因爲.NET已經有你正在尋找的東西。

.NET帶有兩種允許插件的方式。

  1. System.Addin
  2. MEF - 託管擴展框架

(1) System.Addin - 我幾乎沒有聽說過/讀的不多。但是你可以在這裏幾篇文章看一看:
System.Addin article from MSDN magazine < - 注意2007年度
System.Addin tools and examples at Codeplex

(2)現在,MEF,MEF只是真棒!它是一種將插件體系結構引入系統的簡單方法。 MEF也是Silverlight的一部分,Visual Studio 2010使用它。我可以看到你想用動態插件加載dll,通過MEF你可以用你的軟件包裝的類可以在你自己的程序集(.exe)中設計你的應用程序,然後你可以使用MEF動態查找在將來會有你需要的類的dll。整個過程本身在MEF中非常簡單。

Mike Taulty has a brilliant video series on MEF

MEF Article at Codeproject - Part 1 MEF Article at Codeproject - Part 2

MEF is Open Source on Codeplex

我個人認爲你應該去MEF,其新的,易於甚至Visual Studio中使用它,即使是這樣,你可以去看看at:
Choosing between MEF and MAF (System.AddIn)

Do check out other top voted questions on the mef tag at SO

6

您可以使用FileSystemWatcher類來監視目錄中的更改。

publicvoid CreateWatcher() 
{ 
//Create a new FileSystemWatcher. 
FileSystemWatcher watcher = newFileSystemWatcher(); 

//Set the filter to only catch DLL files. 
watcher.Filter = "*.dll"; 

//Subscribe to the Created event. 
watcher.Created += new 
FileSystemEventHandler(watcher_FileCreated); 

//Set the path to C:\Temp\ 
watcher.Path = @"C:\Temp\"; 

//Enable the FileSystemWatcher events. 
watcher.EnableRaisingEvents = true; 
} 

然後它成爲一個即插即用的事情:)

3

MEF 這是創建插件設計的一個非常強大的架構解決方案。

1

這很好。或者,如果您覺得在所述文件夾中有大量DLL可能會影響您的應用程序,並且可能存在一些安全問題,因爲任何人都可能將DLL推送到該文件夾​​中,您也可以定義要將哪些程序集加載到配置文件中。

0
  • 由於插件意思是:「你DONOT知道DLL提前裝入」有沒有辦法提前綁定的部份「未知DLL」你必須加載和搜索界面的實現,並使用一種後期綁定
  • 「搜索DLL」而不是「編輯配置文件」非常友好。在大多數情況下,搜索DLL不是一個性能問題,因爲它只在程序啓動時完成一次。

我覺得你的設計還行。

0

對於您的場景,我建議使用MEF及其DirectoryCatalog從特定文件夾加載插件。如果您另外配置文件系統觀察器並刷新文件夾更改的DirectoryCatalog,多虧了MEF的重新構建功能,您將能夠在運行時提取新的插件!順便說一句,你可以看到一個nice recomposition sample I did for one of my MEF talks