Подтвердить что ты не робот

Reflection.Net: как загружать зависимости?

Я пытаюсь добавить систему аддонов к моему приложению Windows.Net с помощью Reflection; но он терпит неудачу, когда есть аддон с зависимостью.

Класс Addon должен реализовать интерфейс "IAddon" и иметь пустой конструктор.
Основная программа загружает аддон с помощью Reflection:

Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\Addon.dll");
Type t = assembly.GetType("Test.MyAddon");
ConstructorInfo ctor = t.GetConstructor(new Type[] { });
IAddon addon= (IAddon) ctor.Invoke(new object[] { });
addon.StartAddon();

Он отлично работает, когда аддон не использует dependencie. Но если мой аддон ссылается и использует другую DLL (C:\Temp\TestAddon\MyTools.dll), которая сохраняется рядом с аддоном на диске, она не работает:
System.IO.FileNotFoundException: Не удалось загрузить файл или сборку "MyTools.dll" или одну из его зависимостей.

Я не хочу копировать DLL-аддоны рядом с моим исполняемым файлом, как я могу это сделать, чтобы сообщить .Net runtime для поиска в "C:\Temp\TestAddon \" для любой зависимости?

Обратите внимание, что добавление

Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\MyTools.dll");

ничего не меняет.

4b9b3361

Ответ 1

Если MyTools.dll находится в том же каталоге, что и Addon.dll, все, что вам нужно сделать, это вызвать Assembly.LoadFrom вместо Assembly.LoadFile, чтобы ваш код работал. В противном случае обработка события AppDomain.AssemblyResolve - это путь.

Ответ 2

Вы изучали использование контейнера Inversion Of Control? Я использую Castle Windsor с внешним файлом Boo, который позволяет мне легко расширять аппликацию без необходимости перекомпилировать или беспокоиться о предоставлении зависимостей

Ответ 3

Пара вариантов:

  • Вы можете подключиться к AppDomain.AssemblyResolve, чтобы помочь CLR разрешить сборку.
  • Вы можете посмотреть на выделение надстроек в свои собственные AppDomain (см. System.AddIn и этот сайт).

Ответ 4

Вы можете использовать отражение для доступа к закрытому Assembly. _GetReferencedAssemblies().

Несмотря на то, что метод может измениться в будущей версии .NET Framework, он не кажется вероятным -Ap.NET сильно зависит от него, хотя возможно, что они могут перемещать его от mscorlib до System.Web, который это единственная сборка, о которой я знаю, откуда относится метод.

Ответ 5

Assembly.LoadFrom работает хорошо, пока я не попытаюсь использовать webService в своем аддоне, у меня был "Невозможно наложить объект типа" X "на исключение типа" X ".

Это уродливо, но я буду использовать Assembly.LoadFile с AppDomain.AssemblyResolve.

Спасибо, ребята.