Путь поиска сборки через среду %PATH%

#c# #assemblies #environment

#c# #сборки #Окружающая среда

Вопрос:

Я разрабатываю проект и хочу отделить общие сборки от папки проекта

   Program Files
      My Company

        Commons
          * Assembly1.dll
          * Assembly2.dll
          * Assembly3.dll
          * Assembly4.dll

        Project1
          * MyProject1.exe
          * MyProject1.exe.config

        Project2
          * MyProject2.exe
          * MyProject2.exe.config
  

пытаюсь заставить проекты загружать сборки из папки «Commons», поэтому я меняю системную среду %PATH% для поиска DLL.

 %PATH% = c:Program filesMy CompanyCommons;%PATH%
  

но они не ищут среду Path (мониторинг с помощью ProcessMonitor)
Кто-нибудь может показать мне, как определить путь поиска для сборок из среды %PATH%.

Ответ №1:

 string path = System.Environment.GetEnvironmentVariable("Path");
var folders = path.Split(';');
foreach (var folder in folders)
{
    foreach (var file in Directory.GetFiles(folder, "*.*"))
    {
        // found files
    }
}
  

Выполните поиск в AppDomain.AssemblyResolve событии, чтобы найти библиотеки DLL при запуске вашего приложения. Более подробная информация об этом событии здесь: http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx

Комментарии:

1. Обратите внимание, что переменная path может содержать несуществующие каталоги (например, если приложение было удалено без его очистки), поэтому вам следует проверить это с помощью Directory.Exists(), прежде чем выполнять Directory . GetFiles().

Ответ №2:

Я не верю, что dotNET полагается на переменную окружения path при привязке сборок.

Смотрите http://ondotnet.com/pub/a/dotnet/2003/03/17/bindingpolicy.html для политики привязки к dotNET.

Особенно полезным может оказаться элемент здесь: http://msdn.microsoft.com/en-us/library/efs781xb(v=VS.100).aspx

Комментарии:

1. я уже пытался установить privatePath в app.config, но путь должен находиться в папке проекта для поиска. если я установлю его «.. / Commons», он не будет отображаться в верхних папках. Я хочу, чтобы myapp искал библиотеки DLL через среду %PATH%. Спасибо

2. Я обнаружил, что очень просто сохранить частные сборки и GAC в качестве единственных путей, содержащих сборки, на которые ссылаются. Нет ничего плохого в том, чтобы сохранить пару копий библиотек DLL, на которые даны ссылки. Преимущество заключается в том, что совершенно ясно, какая сборка будет использоваться вашим приложением.