Не удалось загрузить файл или сборку или одну из ее зависимостей. Система не может найти указанный файл. (GAC не допускается)

У меня есть программа "Main", которая динамически загружает мой собственный файл "plugin.dll", используя отражение. Файл "plugin.dll" ссылается на стороннее устройство "device.dll" с помощью визуальных студийных ссылок. Пока "device.dll" и "plugin.dll" находятся в той же папке, что и "Основная" программа, или "Основная" программа имеет ссылку на "plugin.dll", все работает нормально. Но как только я перемещаю файл "device.dll" в другую папку, я получаю следующее сообщение об ошибке: "Не удалось загрузить файл или сборку или одну из ее зависимостей. Система не может найти указанный файл". Проблема возникает из-за того, что программа не находит файл "device.dll". Свойство "Копировать локальное" или "Ссылочные пути" не влияет на эту проблему. Я понимаю, что мне нужно указать путь к "device.dll", но я не мог найти способ сделать это, не помещая "plugin.dll" и "device.dll" в GAC (глобальный кэш сборок). GAC не является решением, потому что сторонний dll также должен иметь строгое имя (демонтировать и снова собрать), что не разрешено лицензией на авторское право.

Дополнительные сведения: Использование Visual Studio 2013 и.Net Framework 4.0 FUSLOGVW не регистрирует никаких ошибок (есть идеи, почему?).

Ждем ваших предложений, заранее спасибо.

1 ответ

Решение

Проверить AppDomain.AssemblyResolve событие. Это идеальная точка, в которой вы можете выполнить пользовательское действие, чтобы загрузить сборку в нестандартном месте.

Я добавляю сюда цитату из связанной статьи MSDN:

ResolveEventHandler несет ответственность за это событие, чтобы вернуть сборку, указанную в свойстве ResolveEventArgs.Name, или вернуть null, если сборка не распознана. Сборка должна быть загружена в контекст выполнения; если он загружен в контекст только для отражения, загрузка, которая вызвала это событие, завершается неудачно.

В конце концов, это означает, что ваше приложение или услуга войдет в AssemblyResolve случай, когда сборка не может быть загружена с использованием подхода обнаружения сборки по умолчанию (AppDomain.BaseDirectory, Глобальный кеш сборок...).

Как только возникает так называемое событие, вам нужно вернуть экземпляр Assembly и ваша задача решить, как загрузить сборку (из файла, потока, байтов...). То есть, если вы размещаете сборки плагинов в каком-либо подкаталоге или кто знает где, вы можете позвонить Assembly.Load с правильным полным путем сборки, чтобы загрузить их и избежать проблем с загрузкой сборки.

Другие вопросы по тегам