Установить пользовательский путь к ссылочным DLL?

У меня есть проект C # (назовите его MainProj ), который ссылается на несколько других DLL-проектов. Добавив эти проекты в MainProj на MainProj , он их построит и скопирует полученные DLL в рабочий каталог MainProj.

Я бы хотел, чтобы эти ссылочные DLL были расположены в подкаталоге рабочего каталога MainProj, то есть MainProj / bin / DLL, а не в самом рабочем каталоге.

Я не очень опытный программист на C #, но, исходя из мира C ++, я предполагаю, что одним из способов было бы удалить ссылки на проект и явно загрузить требуемые DLL по пути и имени файла (то есть в C ++, LoadLibrary ). Однако я предпочел бы сделать это, если бы это было так, было бы установить какой-то «ссылочный двоичный путь», так что все они будут автоматически скопированы в этот поддирелл, когда я буду строить (а затем буду ссылаться туда без мне нужно явно загружать каждый). Возможно ли это?

Если нет, то какой из предпочтительных методов в C # выполнить то, что мне нужно (т.е. что-то с Assembly.Load / Assembly.LoadFile / Assembly.LoadFrom ? Что-то в AppDomain возможно, или System.Environment ?)

С этой страницы (непроверенный мной):

Где-то в инициализации вашей программы (прежде чем вы получите доступ к любым classам из ссылочной сборки) выполните следующее:

 AppDomain.CurrentDomain.AppendPrivatePath(@"bin\DLLs"); 

Изменить: В этой статье говорится, что AppendPrivatePath считается устаревшим, но также дает обходное решение.

Edit 2: Похоже, самый простой и самый кошерный способ сделать это в файле app.config (см. Здесь ):

        

От Tomek ответьте на: Загрузка DLL из пути, указанного в SetdllDirectory, в c #

 var dllDirectory = @"C:/some/path"; Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") + ";" + dllDirectory) 

Это отлично работает для меня!

Вот еще один способ продолжить работу без использования устаревшего AppendPrivatePath . Он ловит какое-то событие « связанная DLL не найдена » (поэтому он будет вызываться только в том случае, если dll не найден в каталоге по умолчанию).

Работает для меня (.NET 3.5, не проверены другие версии)

 ///  /// Here is the list of authorized assemblies (DLL files) /// You HAVE TO specify each of them and call InitializeAssembly() ///  private static string[] LOAD_ASSEMBLIES = { "FooBar.dll", "BarFooFoz.dll" }; ///  /// Call this method at the beginning of the program ///  public static void initializeAssembly() { AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs args) { string assemblyFile = (args.Name.Contains(',')) ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name; assemblyFile += ".dll"; // Forbid non handled dll's if (!LOAD_ASSEMBLIES.Contains(assemblyFile)) { return null; } string absoluteFolder = new FileInfo((new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).LocalPath).Directory.FullName; string targetPath = Path.Combine(absoluteFolder, assemblyFile); try { return Assembly.LoadFile(targetPath); } catch (Exception) { return null; } }; } 

PS: Мне не удалось использовать AppDomainSetup.PrivateBinPath , это слишком трудоемко.

  • Возrotation временного объекта и привязка к константной ссылке
  • Возможна ли пустая ссылка?
  • Тип возврата '?:' (Тернарный условный оператор)
  • Java: разница между сильным / мягким / слабым / фантомным ссылкой
  • Как получить доступ к переменной из другого скрипта в другом игровом объекте через GetComponent?
  • C ++: ссылка const, перед vs после спецификатора типа
  • Является ли практика возвращения ссылочной переменной C ++ злом?
  • что такое возвращаемый тип оператора присваивания?
  • Понимание classов ссылок Java: SoftReference, WeakReference и PhantomReference
  • Почему «универсальные ссылки» имеют тот же синтаксис, что и ссылки rvalue?
  • Как обратиться к документации Microsoft.Office.Interop.Excel?
  • Interesting Posts

    Безголовый браузер и соскабливание – решения

    Любые хорошие инструменты ORM для разработки Android?

    Накладные расходы памяти Java HashMap по сравнению с ArrayList

    Как настроить мой ADSL-модем и домашний компьютер для доступа к внешним устройствам?

    Как запустить Chrome в режиме киоска в учетной записи киоска Windows 8.1 (назначенный доступ)?

    Передача строк из C # в C ++ DLL и обратно – минимальный пример

    Ближайшая точка к данной точке

    Локальное программное обеспечение резервного копирования?

    Как извлечь данные из графика изображения

    Хорошая библиотека C ++ для SOAP

    C # Entity-Framework: как я могу объединить .Find и .Include в объекте модели?

    Переопределить метод .ToString c #

    powershell: как избежать всех символов регулярных выражений из строки

    Список поиска с взаимным счетом (2-я попытка)

    Почему эти конструкции используют предопределенное поведение до и после инкремента?

    Давайте будем гением компьютера.