Как заставить принудительно загрузить сборку? - PullRequest
3 голосов
/ 23 февраля 2009

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

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

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

Ответы [ 6 ]

3 голосов
/ 23 февраля 2009

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

3 голосов
/ 23 февраля 2009

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

2 голосов
/ 23 февраля 2009

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

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

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

1 голос
/ 09 декабря 2011

Как подсказывает foson, используйте codebase в конфигурационном файле вашей консоли. Пример показан ниже (измените publicKeyToken, name, version и 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 с тем же именем, культурой, publickeytoken, но новой версией. Следовательно, единственное изменение - в файле конфигурации консоли. Вам не нужно менять ссылку в исходном коде консоли. Вы можете просто продолжать использовать существующее консольное приложение.

0 голосов
/ 23 февраля 2009

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

0 голосов
/ 23 февраля 2009

Возможно, вы захотите взглянуть на событие AppDomain.AssemblyResolve .

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

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