Вопрос

Я пытаюсь добавить систему дополнений в свое приложение 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 времени выполнения искать в " C: \ Temp \ TestAddon \ " для какой-либо зависимости?

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

<Ол>
  • Вы можете присоединиться к AppDomain.AssemblyResolve , чтобы помочь CLR разрешить сборку.
  • Вы можете изучить изоляцию надстроек в их собственном AppDomain (см. пространство имен System.AddIn и этот веб-сайт ).
  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top