2010-02-10 3 views
4

Я работаю над приложением, которое загрузит плагины. Модули подключаемых модулей находятся в каталоге, который находится ниже основного каталога моего приложения.Настройка частного пути для загрузки сборников плагинов

выглядит так:

 
MyAppFolder 
----------->ThePluginFolder 
----------------Assembly1 
----------------Dependency1 

Моя проблема возникает с Dependency1 (это собрание, что ссылки на узел 1). CLR не находит его.

Я сделал некоторое чтение в Fusion, и, похоже, я мог бы исправить это, установив частный путь с currentAppDomain.AppendPrivatePath.

Однако в справке .NET 4.0 они говорят, что этот метод устарел. Они указывают мне на AppDomainSetup, но я не могу использовать это для изменения моего текущего домена приложения.
Кто-нибудь знает, что еще я могу сделать, чтобы загрузить эти зависимости?

Опции Я рассмотрел:

  1. Я мог бы вручную перебрать ссылки Ассамблеи1, и если я найду сборку в папке плагина, я могу вручную загрузить его. (похоже, мой лучший вариант, но я хочу убедиться, что я ничего не пропустил)

  2. Я мог бы связать событие AssemblyResolve моего текущего домена (но это даже выглядит странно - вы возвращаете значение. означает, что это не многоадресной рассылки? Я обработки один аспект плагин (бизнес-правил), что, если другая часть моего приложения хотел плагин в отчетах? Будет ли мне нужен 1 глобальный обработчик событий?

ответ

2

Спасибо за помощь, ребята. В моем случае я обнаружил, что лучше всего найти плагины в моей основной папке приложения. Хотя я мог бы загрузить Load() или LoadFrom(), чтобы загрузить сборки в отдельных каталогах (и, похоже, это сработает), я позже столкнулся с проблемами сериализации (упомянутая сборка имела классы, которые должны быть сериализованы и десериализованы).

Я попытался использовать LoadFrom() и Load(), предоставив различные данные в параметре AssmblyName. Я даже «вручную» загружал сборки, на которые ссылались мои плагины. Никакая динамическая нагрузка не приведет к десериализации (я получил исключения).

я нашел только 3 способа, чтобы моя динамически загруженные плагин работы с сериализацией:

  1. Использованием CurrentDomain.AppendPrivatePath, чтобы добавить путь к каталогу, в котором были мои сборки (этот метод устарел)

  2. Подключить событие ResolveAssembly в текущем AppDomain (это сработало бы, но оно получило название alot, и я не хочу влияют на производительность моего приложения - обратите внимание, что я не сделал измерения, хотя).

  3. Просто поместите сборки в мой основной каталог. (это было самое простое решение, и единственным аргументом против этого было то, что структура каталогов была не такой аккуратной, как мои другие варианты. Итак, все рассмотрено. Я взял этот маршрут.

+0

FWIW, вы (или другие будущие посетители) также могут быть заинтересованы в моей попытке решить проблему, изложенную в [этом вопросе и его ответах] (http://stackoverflow.com/questions/10923727/plugin-appdomains-workaround). –

+0

Спасибо O.R. Mapper! – JMarsch

1

Модули плагинов обычно загружаются с помощью отражения с использованием Assembly.LoadFrom и не должны ссылаться на ваш проект, в противном случае они жестко закодированы. Единственная общая вещь между приложением и плагином - это отдельная сборка, содержащая интерфейсы это обе справка. Тогда у вас может быть файл конфигурации, в котором вы указываете плагины для загрузки во время выполнения.

+1

@Darin: Мой проект не ссылается на плагин (я использую Assembly.LoadFromFile для его загрузки). Что происходит, так это то, что My project динамически загружает плагин. Плагин, в свою очередь, ссылается на сборку. Эта вторичная сборка, на которую ссылаются плагин - это тот, который не загружается. – JMarsch

+0

@JMarsch: согласно документации: 'Контекст load-from позволяет сборке загружаться из пути, не включенного в зондирование, и все же позволяет зависимым от этого пути быть найден и загружен, потому что информация о пути поддерживается контекстом. ' –

+0

Интересно. дайте попробовать. Возможно, я бы выбрал LoadFrom вместо LoadFile. – JMarsch

1

Этот сценарий работает для меня, мой плагин напрямую зависит от моего каталога приложений (его веб-приложения), а динамически загружаемые библиотеки DLL находят свои DLL-ссылки в той же папке. Их ссылки на DLL также загружаются в виде плагинов по моему приложению, хотя они знают об их существовании ...

+0

Да, это мой вариант 1 - заставить вызывающее приложение загружать зависимости вручную. Спасибо - вы добавили некоторую проверку на этот план атаки. – JMarsch

Смежные вопросы