2011-01-20 2 views
8

У меня есть программа, которую я разработал, чтобы использовать базовую архитектуру плагина. Эффективно, когда программа загружается, она использует отражение для поиска в каталоге для dll, которые соответствуют определенному интерфейсу, а затем загружают их. Теперь выясняется, что текущий список плагинов - это все, что будет использоваться.Плагин-архитектура C# DLL

Таким образом, является ли моя текущая практика проверки файлов dll по-прежнему лучшей практикой, или есть ли лучшие способы загрузки каждой dll?

Спасибо.

+0

Вы можете немного уточнить свой вопрос с помощью своего образца кода? Я спрашиваю об этом, потому что я уже разработал очень похожую плагинную архитектуру, которая сканировала dll в каталоге плагинов. Если мы увидим ваш родственный источник, я думаю, что мы можем дать советы. – HuseyinUslu

+0

Вы имеете в виду под «dll's, который соответствует определенному интерфейсу», что вы всегда загружаете все сборки плагинов и проверяете CLASSES на интерфейс? Вы используете reflectionOnly загрузки? Не могли бы вы быть более информативными в отношении «текущий список плагинов - это все, что будет использоваться». Вы имеете в виду, что вы вообще не находите никаких плагинов даже после успешной загрузки сборников? «Есть ли более эффективные способы загрузки каждой DLL». По сравнению с тем, что именно? Интересная тема, но не может помочь, не получая больше информации. –

+0

Я бы очень хотел попросить кого-то с полномочиями изменить название! ИМО на основе того, что ОП, что его довольно вводит в заблуждение. Я повторил вопрос. – gideon

ответ

14

С вашего вопроса, похоже, вы построили (или пытаетесь построить) свою собственную архитектуру плагина. Это не такая хорошая идея, так как у .NET уже есть то, что вы ищете.

. NET поставляется с двумя способами для плагинов.

  1. System.AddIn
  2. MEF - Управляемый Расширяемость Framework

(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 использует его, даже, так что вы можете взглянуть по адресу:
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
  • Поскольку плагин средним: «вы выигрыш знают библиотеки DLL для загрузки заранее» нет никакого способа раннего связывания тыс «неизвестного длл» вы должны загрузить и искать для реализации интерфейса и использовать вид от поздняя перевязка.
  • «Поиск dll» вместо «редактирования конфигурационного файла» очень удобен для пользователя. в большинстве случаев поиск dll не является проблемой производительности, поскольку он выполняется только один раз при запуске программы.

Я думаю, ваш дизайн в порядке.

0

Для вашего сценария я рекомендую использовать MEF и его DirectoryCatalog для загрузки плагинов из определенной папки. Если вы дополнительно настроите наблюдателя файловой системы и обновите DirectoryCatalog при изменении папки, благодаря функции перекомпоновки MEF, вы сможете вытащить новые плагины во время выполнения! Кстати, вы можете увидеть nice recomposition sample I did for one of my MEF talks.