Reflection.Net: как загрузить зависимости? - PullRequest
28 голосов
/ 08 октября 2008

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

Класс аддона должен реализовывать интерфейс «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();

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

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

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

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

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

Ответы [ 5 ]

40 голосов
/ 08 октября 2008

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

2 голосов
/ 08 октября 2008

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

1 голос
/ 08 октября 2008

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

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

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

1 голос
/ 08 октября 2008

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

Хотя метод может измениться в будущей версии .NET Framework, это маловероятно - ASPP. Сильно зависит от него, хотя возможно, что они могут переместить его из * 1011. * to System.Web - единственная известная мне сборка, на которую ссылается метод.

1 голос
/ 08 октября 2008

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

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