Сборка Загрузка и загрузка зависимостей «sub-modules» - «не удается найти указанный файл» - PullRequest
0 голосов
/ 25 мая 2010

Есть несколько вопросов, которые задают один и тот же вопрос.Однако ответы, которые они получили, я не могу понять, поэтому здесь идет речь:

Подобные вопросы:
Динамически загружать сборку и вручную принудительно устанавливать путь для получения ссылочных сборок ;
Загрузкасборки и его зависимости

Короче вопрос: Мне нужно выяснить, как можно динамически загружать зависимости, т.е. ссылки в моих модулях .Сейчас я получаю сообщение «Система не может найти указанный файл» в сборках, на которые ссылаются мои так называемые 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

1 Ответ

0 голосов
/ 25 мая 2010

попробуйте сделать assembly = Assembly.Load(bytes); для сборки MyGreatXmlProtocol. Я где-то читал, что если вы загружаете сборку байтовым массивом, вы должны разрешать зависимости вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...