Неуправляемая зависимость DLL не загружается при вызове функций - PullRequest
1 голос
/ 18 февраля 2011

Я работаю с Makefiles в Cygwin в XP, но использую компилятор командной строки Visual Studio 2005. Неуправляемый код написан на C ++, а управляемый код - Managed C ++.

У меня есть проект, который создает кучу неуправляемых DLL и одну управляемую DLL. Управляемая DLL является оболочкой для одной неуправляемой DLL, которая затем ссылается на многие другие неуправляемые DLL.

Например, -> Неуправляемый / Управляемый -> Неуправляемый -> Неуправляемый \ -> Неуправляемый и т. Д .;

У меня есть драйвер для тестирования управляемого кода, который загружает управляемую DLL, создает объект и вызывает вызовы управляемой оболочки.

Так вот в чем дело. Пока я оставляю все необходимые библиотеки DLL в одном каталоге с исполняемым файлом тестового драйвера, все работает нормально. Но мне нужно переместить библиотеки DLL в другой каталог, чем тестовый драйвер exe.

Если я перенесу все в другой каталог, все перестанет работать. (Я даже не получаю сообщение об ошибке при запуске test.exe, он «запускается», а затем возвращается в командную строку.) Очевидно, это проблема DLL.

(Вы знаете, я не могу использовать GAC или% PATH%, чтобы test.exe мог найти библиотеки DLL.)

Так что я много занимался поиском и пробовал различные методы, чтобы выяснить, как получить test.exe для просмотра библиотек DLL.

Я пытался указать пути к приложениям. Не сработало А потом прочитал из http://msdn.microsoft.com/en-us/library/ms682586%28VS.85%29.aspx, что «ключ App Paths не используется при вычислении пути поиска DLL».

Я пробовал все виды вещей с файлами манифеста.

Я попробовал кучу вещей, которые, скорее всего, не работали бы в любом случае, но я становился отчаянным.

А недавно я попробовал подход app.config.

С этим последним подходом у меня был некоторый успех, потому что test.exe запускается, но умирает во время выполнения с ошибкой, когда test.exe пытается выполнить вызовы из DLL. Все до этого исполняется.

Например, если я запускаю test.exe, он запрашивает у пользователя некоторую информацию. Если информация неверна, то она возвращает ошибку обратно пользователю, но если информация верна, она возвращает эту ошибку:

"Ошибка: произошла ошибка синтаксического анализа ASCII: не удалось загрузить динамическую библиотеку [ATC15.dll]. Указанный модуль не найден."

Затем test.exe продолжает выполнять оставшийся код.

Поэтому, пожалуйста, помогите мне понять, как заставить исполняемый файл "видеть" все библиотеки DLL.

1 Ответ

1 голос
/ 19 февраля 2011

Ганс высказал хорошую мысль. Я посмотрел на SetDLLDirectory (забыл упомянуть об этом), но мне так и не удалось заставить его работать. Я всегда получал одинаковые результаты: запускаю программу и ничего не произойдет.

Однако я воспользовался его советом и заново исследовал функцию SetDLLDirectory. Я добавил:

#include "windows.h"
WINBASEAPI
BOOL
WINAPI
SetDllDirectoryA(
__in_opt LPCSTR lpPathName
);
#define SetDllDirectory SetDllDirectoryA

к началу моего кода, а затем также вызов к SetDLLDirectory ("c: \ path"); а затем перекомпилировать. Запустил программу, и она все еще не работала.

Но затем я добавил файл app.config в свой каталог

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <probing privatePath="putDLLsHere"/>
         <dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

Это вместе сработало.

Спасибо, Ганс, за то, что направили меня в правильном направлении!

...