Я пытаюсь добавить систему дополнений в свое приложение Windows.Net с помощью Reflection; но это не удается, когда есть аддон с dependencie.
Класс 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();
Он отлично работает, когда аддон не использует зависимости.
Но если моя ссылка на аддон и использовать другую DLL (C: \ Temp \ TestAddon \ MyTools.dll), которая сохранена рядом с аддоном на диске, это не сработает:
System.IO.FileNotFoundException: не удалось загрузить файл или сборку MyTools.dll или одну из ее зависимостей.
Я не хочу копировать DLL аддонов рядом с моим исполняемым файлом, как я могу сказать, что среда выполнения .Net должна искать в "C: \ Temp \ TestAddon \" какие-либо зависимости?
Обратите внимание, что добавление
Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\MyTools.dll");
ничего не меняйте.





Пара вариантов:
AppDomain.AssemblyResolve, чтобы помочь CLR разрешить сборку.AppDomain (см. Пространство имен System.AddIn и этот сайт).Если MyTools.dll находится в том же каталоге, что и Addon.dll, все, что вам нужно сделать, это вызвать Assembly.LoadFrom вместо Assembly.LoadFile, чтобы ваш код заработал. В противном случае обработка события AppDomain.AssemblyResolve - лучший вариант.
Вы изучали возможность использования контейнера Инверсия контроля? Я использую Castle Windsor с внешним файлом Boo, который позволяет мне легко расширять приложение без необходимости перекомпилировать или беспокоиться о предоставлении зависимостей.
Вы можете использовать отражение для доступа к частному Assembly._GetReferencedAssemblies().
Хотя метод мог изменится в будущей версии .NET framework, это маловероятно - от него сильно зависит ASP.NET, хотя вполне возможно, что они могут переместить его с mscorlib на System.Web, который является единственной сборкой, которую я знаю. из, откуда идет ссылка на метод.
Assembly.LoadFrom работает хорошо, пока я не попробую использовать webService в своем аддоне, у меня было исключение «Невозможно преобразовать объект типа X в тип X».
Это некрасиво, но я буду использовать Assembly.LoadFile с AppDomain.AssemblyResolve.
Спасибо ребята.
Жалко, что @Andreas не было рядом с 2010 года, я бы дал вам награду, если бы подумал, что вам не все равно. Лети на свободу, маленький австрийский гений.