Как ссылаться на сборки вне папки bin в приложении ASP.net? - PullRequest
10 голосов
/ 30 июля 2009

У меня есть работающий веб-сервис XML, написанный на ASP.Net. Теперь мне нужно сослаться на определенные сборки, лежащие в определенной папке, например. c:\NotMyCode
Я не хочу скопировать / продублировать миллионы dll-файлов из этой папки в мою папку bin.

Я пытался сохранить CopyLocal=false для сборок, указанных в веб-службе. Это закончилось исключением FileNotFound для сборки. Когда я переключаюсь на CopyLocal=true, указанные библиотеки DLL копируются в папку bin ... и это работает.

Итак, мой вопрос здесь: Как мне ссылаться на сборки, которые не лежат в моей папке bin или подпапке под ней? Нужно ли где-нибудь менять файлы политики безопасности? Я думаю, что я не первый человек, который когда-либо хотел сделать что-то подобное ... поэтому я предполагаю, что кто-то уже решил эту проблему.

(Я пытался выдать себя за администратора на панели конфигурации IIS ASP.net, но это тоже не сработало.)

Обновление: Не удается установить его в GAC * . Чтобы дать аналогию, этот веб-сервис предоставляет упрощенное представление стороннему приложению, например, StarTeam. Я не могу (не должен .. не хочу ..) копировать все двоичные файлы в этой папке в папку bin или устанавливать их в GAC

Ответы [ 5 ]

14 голосов
/ 31 июля 2009

Согласно документации MSDN ,

Ссылочные сборки вне корневого каталога приложения должны иметь строгие имена и должны устанавливаться в глобальном кэше сборок или указываться с использованием элемента <codeBase>.

Так что может показаться, что вам не повезло. Вот что я попробую:

  1. Создайте точку соединения NTFS в базовом каталоге вашего приложения, которая указывает на каталог, содержащий ваш общий код. Это ключевой шаг. Например, в базовом каталоге вашего приложения запустите linkd SharedCode c:\NotMyCode. Это делает <yourappbase>\SharedCode фактически псевдонимом для c:\NotMyCode.
  2. Скажите ASP.NET для поиска сборок по этому пути, используя элемент <probing>, ссылающийся на точку соединения SharedCode. Так как это под вашей прикладной базой, оно должно работать. В качестве альтернативы, используйте AppDomainSetup.PrivateBinPath , чтобы установить путь, проверяемый для сборок.

Мне очень любопытно посмотреть, сработает ли это: -)

4 голосов
/ 09 апреля 2012

Вы всегда можете использовать: Событие AppDomain.CurrentDomain.AssemblyResolve и позвоните

Assemly.Load(Path.Combine(@"c:\NotMyStuff",args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll"))

Подробнее см. ссылка .

0 голосов
/ 30 июля 2009

Вы можете вставить GAC и получить к нему доступ оттуда.

0 голосов
/ 30 июля 2009

Я думаю, вы также можете ссылаться на конкретные пути сборки в коде.

AppDomain.CurrentDomain.AppendPrivatePath("C:\\NotMyCode");

Выполнение этого в вашем Global.asax Application_Start должно помочь.

0 голосов
/ 30 июля 2009

Вы всегда можете поместить свои ссылочные сборки в GAC, тогда местоположение не будет иметь значения. Вы можете установить компонент, перетащив его в GAC (C: \ windows \ assembly) или запустив GACUtil.exe.

Эта статья может помочь. Он описывает « Рекомендации по загрузке сборки

Сначала я подумал, что вы можете использовать элемент <probing privatePath="bin\debug"/> в runtime / assemblyBinding в web.config, но зондирование позволит вам указывать только подкаталоги в корневом каталоге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...