Вызов DLL-файлов, расположенных в другом каталоге
У меня есть консольное приложение (NGameHost
) работает в определенном каталоге (C:\Program Files\NetworkGame3\api\
). Он использует файлы, доступные в этом каталоге, и консольное приложение хорошо работает при запуске самостоятельно. Он также предоставляет различные методы, которые используют библиотеки DLL (и другие файлы, такие как файлы конфигурации) из этого каталога. Теперь у меня есть другое консольное приложение (расположенное в другом месте), которое пыталось вызвать эти методы и вернуть результаты. Я поставил Copy Local: False
так что он выполняется внутри этого каталога вместо создания локальной версии. Однако я получаю сообщение об ошибке "Не удалось загрузить файл или сборку... или одну из ее зависимостей. Система не может найти указанный файл".
Как я могу вызвать методы из консольного приложения, расположенного в другом каталоге?
3 ответа
Когда вы устанавливаете copy local = false, вы говорите, что не копируйте сборку в локальный каталог, и в этом случае сборка будет доступна в одном из мест, где среда выполнения ее ищет.
Посмотрите, как среда выполнения находит сборку
Ваша сборка должна быть либо в GAC, либо в одном из зондов исследования.
Вы можете использовать GAC, подход конфигурации или событие разрешения сборки.
Этот KB описывает это более подробно:
http://support.microsoft.com/kb/837908
Также посмотрите на пути прохождения:
http://msdn.microsoft.com/en-us/library/15hyw9x3(v=vs.71).aspx
Недавно я ударился головой о кирпичную стену, пытаясь решить очень похожую проблему. У меня есть DLL, которую я хочу загрузить во время выполнения, и у нее есть свои зависимости. Я не мог понять, почему он будет загружаться, но при вызове конструктора класса в загруженной сборке ошибка не возникала, а выполнение просто останавливалось, и вы удивлялись, что происходит.
Оказывается, что зависимость загруженной сборки была в другой версии.NET, и в этом коде есть файл App.Config для включения сборок в смешанном режиме. Поэтому мне, естественно, пришлось внести это и в мой код, так как я вызываю сборку, которая вызывает сборку в другой версии.NET.
Ошибка не появлялась до тех пор, пока я не скопировал все библиотеки DLL зависимостей в мое приложение в разработке. Теперь я могу удалить их снова! При этом я получаю предупреждающее сообщение DLL Loader Lock. Если я подавляю или игнорирую это, мой код работает.
В моем случае разрешение было:
<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>