Вызов 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>
Другие вопросы по тегам