2015-04-27 3 views
1

У меня есть программа «Главная», которая динамически загружает мой собственный файл «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 должна быть также сильно названа (дизассемблировать и собирать снова), что запрещено лицензией на использование авторских прав.Не удалось загрузить файл или сборку или одну из ее зависимостей. Система не может найти указанный файл. (Не разрешено GAC)

Дополнительная информация: Использование visual studio 2013 и .Net framework 4.0 У FUSLOGVW ошибок не допускается (любые идеи почему?).

С нетерпением жду ваших предложений, заранее.

ответ

4

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

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

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

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

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

+0

Спасибо, это сработало! – Almis

+0

@Almis Нет проблем! Добро пожаловать :) –

+1

@Almis Если этот ответ сработал для вас, вы можете принять его. Таким образом, другие люди могут получить выгоду. –