Добавление каталога временно к путям поиска DLL Windows 7

Я хочу временно добавить, что каталог к путям поиска 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, не только файл) - и он все еще утверждал, что не нашел его.

7
задан Shalom Craimer 9 June 2010 в 10:06
поделиться

2 ответа

Мое решение простое, но мне нелепо прибегать к нему.

Я написал другую сборку, «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));
      }
   }
}

Я бы хотел найти лучшее решение!

0
ответ дан 7 December 2019 в 16:39
поделиться

Я думаю, это связано с проблемами разрешения.

Попробуйте отключить UAC и снова запустить код. Проверьте, сработало ли обновление пути.

Если это так, по крайней мере, вы знаете, с чего начать ...

1
ответ дан 7 December 2019 в 16:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: