Я хочу временно добавить, что каталог к путям поиска DLL - является там корректным способом сделать это в соответствии с Windows 7?
Сценарий
У меня есть приложение C#, давайте назовем его WonderApp.
WonderApp должен назвать DLL C++, расположенный в C:\MyPath
. Таким образом, как часть WonderApp Program.Main()
, Я добавил следующую команду:
Environment.SetEnvironmentVariable("PATH",
"C:\\MyPath;" + Environment.GetEnvironmentVariable("PATH"));
В соответствии с этой статьей, добавляя каталог к PATH
должно также добавить это к поиску каталогов DLLs.
Решение хорошо работает в 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?
ОБНОВЛЕНИЕ: Используя Проводник Процесса, я проверил среду выполнения приложения, и "C:\MyPath" был действительно в PATH
!, Кроме того, я видел это Helper.dll
был в списке открытых дескрипторов (как DLL, не только файл) - и он все еще утверждал, что не нашел его.
Мое решение простое, но мне нелепо прибегать к нему.
Я написал другую сборку, «Shell», которая изменяет среду, запускает WonderApp и завершает работу.
Изменяя ПУТЬ
перед запуском основного приложения (WonderApp), путь поиска DLL главного приложения включает каталоги, добавленные в измененный ПУТЬ
.
Это выглядит так:
namespace shell
{
static class program
{
[dllimport("kernel32.dll", charset = charset.auto, setlasterror = true)]
public static extern bool setenvironmentvariable(string lpname, string lpvalue);
private static string joinargstosinglestring(string[] args)
{
string s = string.empty;
for (int i = 0; i < args.length; ++i)
{
if (!string.isnullorempty(s))
{
s += " ";
}
s += "\"" + args[i] + "\"";
}
return s;
}
[stathread]
static void main(string[] args)
{
string pathbefore = environment.getenvironmentvariable("path");
string wewant = util.paths.getapplicationdatadir() + ";" + pathbefore;
setenvironmentvariable("path", wewant);
Process process = Process.Start(".\\WonderApp.exe", joinArgsToSingleString(args));
}
}
}
Я бы хотел найти лучшее решение!
Я думаю, это связано с проблемами разрешения.
Попробуйте отключить UAC и снова запустить код. Проверьте, сработало ли обновление пути.
Если это так, по крайней мере, вы знаете, с чего начать ...