Есть несколько вопросов, которые задают один и тот же вопрос.Однако ответы, которые они получили, я не могу понять, поэтому здесь идет речь:
Подобные вопросы:
Динамически загружать сборку и вручную принудительно устанавливать путь для получения ссылочных сборок ;
Загрузкасборки и его зависимости
Короче вопрос: Мне нужно выяснить, как можно динамически загружать зависимости, т.е. ссылки в моих модулях .Сейчас я получаю сообщение «Система не может найти указанный файл» в сборках, на которые ссылаются мои так называемые modules .
Я не могу понять, как использовать событие AssemblyResolve ...
Более длинная версия
У меня есть одно приложение, MODULECONTROLLER, которое загружает отдельные модули.
Эти «отдельные модули» находятся в известных подкаталогах,как
appBinDir\Modules\Module1
appBinDir\Modules\Module2
Каждый каталог содержит все библиотеки DLL, которые существуют в каталоге bin этих проектов после сборки.
Таким образом, MODULECONTROLLER загружает все библиотеки DLL, содержащиеся в этих папках, используя этот код:
byte[] bytes = File.ReadAllBytes(dllFileFullPath);
Assembly assembly = null;
assembly = Assembly.Load(bytes);
Я, как вы можете видеть, загружаю массив байтов [] - (поэтому я не блокирую DLL-файлы).
Теперь, например, в MODULE1, яиметь статическую ссылку под названием MyGreatXmlProtocol.MyGreatXmlProtocol.dll затем также существует в каталоге appBinDir\Modules\Module1
и загружается с использованием вышеуказанного кода
Когда код в MODULE1 пытается использовать этот MyGreatXmlProtocol, я получаю:
Could not load file or assembly 'MyGreatXmlProtocol, Version=1.0.3797.26527, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
ИтакВ сообщении (например, this ) они говорят, что
Насколько я понимаю, отражение загрузит основную сборку и затем выполнит поиск в GAC для указанных сборок, если не сможет найтитогда вы можете включить событие assemblyResolve:
Сначала; действительно ли нужно использовать событие AssemblyResolve, чтобы эта работа работала?Разве мои разные МОДУЛИ сами не должны загружать свои библиотеки DLL, так как на них есть статические ссылки?
Секунда; , если AssemblyResolve - это путь - как мне его использовать?Я прикрепил обработчик к событию, но я никогда ничего не получал в MyGreatXmlProctol ...
=== РЕДАКТИРОВАТЬ === КОД, относящийся к обработчику AssemblyResolve-события:
public GUI()
{
InitializeComponent();
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
...
}
//
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Console.WriteLine(args.Name);
return null;
}
Надеюсь, я не был слишком нечетким =)
Thx