Я хочу временно добавить каталог в пути поиска DLL - есть ли правильный способ сделать это в Windows 7?
Сценарий
У меня есть приложение на C #, назовем его WonderApp.
WonderApp необходимо вызвать C ++ DLL, расположенную в C:\MyPath
. Итак, как часть Program.Main()
от WonderApp, я добавил следующую команду:
Environment.SetEnvironmentVariable("PATH",
"C:\\MyPath;" + Environment.GetEnvironmentVariable("PATH"));
Согласно этой статье, добавление каталога в PATH
также должно добавить его в каталоги ищите DLL.
Решение отлично работает в Windows XP: если я добавлю каталог в PATH
, DLL загрузится, и программа будет работать нормально. Если я не добавлю каталог, DLL не загрузится, выйдет ошибка «не найден».
Однако в Windows 7 это не работает.
Итак, я подумал, давайте попробуем использовать SetDllDirectory()
. Нравится:
[System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetDllDirectory(string lpPathName);
А позже:
bool success = SetDllDirectory(Util.Paths.GetApplicationDataDir());
Значение success
равно true
, но DLL по-прежнему не загружается.
Наконец, если я настрою PATH
на включение C:\MyPath
вручную, перед запуском приложения - все заработает! DLL загружается и работает нормально.
Итак, чтобы повторить:
Есть ли правильный способ временно добавить каталог в пути поиска DLL в Windows 7?
ОБНОВЛЕНИЕ. Используя Process Explorer, я проверил среду выполнения приложения и обнаружил, что «C: \ MyPath» действительно находится в PATH
! Более того, я увидел, что Helper.dll
был в списке открытых дескрипторов (как DLL, а не просто файл) - и он по-прежнему утверждал, что не нашел его.