Как указать, откуда загружается сборка?

Я разработал консольную утилиту, которая выполняет некоторые операции с серверным приложением. Из-за характера серверного приложения, с которым я работаю, мне нужно выполнить эту утилиту на сервере.

Проблема в том, что утилита ссылается на общую библиотеку DLL, которая ранее была развернута в GAC сервера. С момента развертывания общей библиотеки DLL она была обновлена, и моя утилита полагается на эти обновления. Я не могу обновить DLL в GAC из-за политики компании в отношении развертывания.

По умолчанию моя утилита будет использовать устаревшую DLL в GAC. Есть ли способ заставить его использовать обновленную DLL (например, указав путь в файловой системе)?


person Alex Angas    schedule 23.02.2009    source источник


Ответы (6)


К сожалению, GAC имеет тенденцию разыгрывать козырную карту, но если вы изменили версию, то разрешение GAC должно завершиться неудачно (если в IDE для параметра «Конкретная версия» установлено значение true), что позволит загрузить локальную версию?

person Marc Gravell    schedule 23.02.2009

У обновленной библиотеки DLL нет нового номера версии? Я ожидаю, что если вы заставите ссылку использовать правильный номер версии, она должна выбрать локальную версию.

person Jon Skeet    schedule 23.02.2009

Класс Assembly имеет несколько методов для загрузки сборок из определенных мест.

Assembly.LoadFrom имеет несколько перегрузок

РЕДАКТИРОВАТЬ: есть способ указать через файл конфигурации, где искать конкретные версии сборки. Точно не помню.

person Megacan    schedule 23.02.2009
comment
Если у вас есть дополнительная информация о методе файла конфигурации, это было бы здорово. - person Alex Angas; 23.02.2009
comment
msdn.microsoft.com/en-us/library/7wd6ex19 (по сравнению с 71).aspx Привязка сборки и базовые теги сборки. Надеюсь, поможет - person Megacan; 23.02.2009

Как предлагает foson, используйте кодовую базу в файле конфигурации вашей консоли. Пример показан ниже (соответствующим образом измените publicKeyToken, имя, версию и href).

<runtime> 
 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
  <dependentAssembly> 
     <assemblyIdentity name="myCommonDll" publicKeyToken="32ab4ba45e0a69a1" culture="neutral" />
     <codeBase version="2.0.0.0" href="file://C:\Users\djpiter\Documents/myCommon.dll"/>
  </dependentAssembly> 
 </assemblyBinding> 
</runtime> 

Так что это был бы самый простой способ заставить CLR перенаправить вызов вашей общей DLL из GAC на версию, находящуюся в месте href. Ваша обновленная общая dll должна иметь строгое имя, как и в GAC, с тем же именем, культурой, токеном открытого ключа, но с новой версией. Таким образом, единственное изменение находится в файле конфигурации консоли. Вам не нужно менять ссылку в исходном коде консоли. Вы можете просто продолжать использовать существующее консольное приложение.

person SamDevx    schedule 08.12.2011


Попробуйте использовать элемент <codebase> в app.config.

person foson    schedule 23.02.2009