Мои библиотеки DLL загружаются сторонним приложением, которое мы не можем настроить. Мои сборки должны находиться в отдельной папке. Я не могу поместить их в GAC (мое приложение требует развертывания с использованием XCOPY). Когда корневая DLL пытается загрузить ресурс или тип из другой DLL (в той же папке), загрузка не выполняется (FileNotFound). Можно ли программно (из корневой DLL) добавить папку, в которой расположены мои библиотеки DLL, в путь поиска сборки? Мне не разрешено изменять файлы конфигурации приложения.
.net
search
assemblies
path
isobretatel
источник
источник
if (!File.Exists(asmPath)) return searchInGAC(...);
Вы можете добавить пробный путь к файлу .config вашего приложения, но он будет работать только в том случае, если пробный путь содержится в базовом каталоге вашего приложения.
источник
AssemblyResolve
решение так много раз, хорошо, что есть другой (и более простой) вариант.Обновление для Framework 4
Поскольку Framework 4 вызывает событие AssemblyResolve также для ресурсов, на самом деле этот обработчик работает лучше. Он основан на концепции, что локализации находятся в подкаталогах приложения (один для локализации с именем культуры, например, C: \ MyApp \ it для итальянского). Внутри находится файл ресурсов. Обработчик также работает, если локализация - страна-регион, т.е. it-IT или pt-BR. В этом случае обработчик «может вызываться несколько раз: один раз для каждого языка и региональных параметров в резервной цепочке» [из MSDN]. Это означает, что если мы возвращаем null для файла ресурсов «it-IT», фреймворк вызывает событие, запрашивающее «это».
Крючок события
Обработчик события
источник
AssemblyName
конструктор для декодирования имени сборки вместо того, чтобы полагаться на синтаксический анализ строки сборки.Лучшее объяснение от самой MS :
источник
AssemblyResolve
предназначен для CurrentDomain, недействителен для другого доменаAppDomain.CreateDomain
Для пользователей C ++ / CLI вот ответ @Mattias S (который работает для меня):
источник
Я использовал решение @Mattias S. Если вы действительно хотите разрешить зависимости из одной и той же папки - попробуйте использовать запрос местоположения сборки , как показано ниже. args.RequestingAssembly следует проверить на нуль.
источник
посмотрите в AppDomain.AppendPrivatePath (устарело) или AppDomainSetup.PrivateBinPath
источник
AppDomain.AppendPrivatePath
документация, кажется, предполагает, что он должен поддерживать динамическое расширениеAppDomain
пути поиска, просто эта функция устарела. Если это сработает, это гораздо более чистое решение, чем перегрузкаAssemblyResolve
.AppDomain.AppendPrivatePath
что ничего не делает в .NET Core и обновляется.PrivateBinPath
в полной структуре .Я пришел сюда из-за другого (отмеченного как повторяющегося) вопроса о добавлении проверочного тега в файл App.Config.
Я хочу добавить к этому примечание - Visual Studio уже сгенерировала файл App.config, однако добавление проверочного тега к предварительно сгенерированному тегу времени выполнения не сработало! вам нужен отдельный тег времени выполнения с включенным тегом исследования. Короче говоря, ваш App.Config должен выглядеть так:
Это заняло некоторое время, поэтому я публикую это здесь. Также кредиты пакету PrettyBin NuGet . Это пакет, который автоматически перемещает библиотеки DLL. Мне понравился более ручной подход, поэтому я не использовал его.
Также - вот сценарий пост-сборки, который копирует все .dll / .xml / .pdb в / Lib. Это убирает загроможденную папку / debug (или / release), чего, я думаю, люди пытаются добиться.
источник