Как я могу заставить .NET использовать локальную копию сборки, которая находится в GAC - PullRequest
67 голосов
/ 06 ноября 2008

У меня есть сборка .NET, которая (по независящим от меня причинам) должна находиться в GAC. Однако эта же сборка используется другой программой, которая имеет собственную копию более старой версии той же сборки. Он должен использовать свою собственную копию, а не то, что находится в GAC. Правильное версионирование в этом случае, вероятно, более хлопотно, чем стоит, по причинам, которые я не буду рассматривать. Мои вопросы: в любом случае нужно сказать .NET: просто используйте ЭТУ DLL, прямо здесь, в этом каталоге - игнорируйте все, что вы найдете в GAC или где-либо еще .

Ответы [ 6 ]

44 голосов
/ 06 ноября 2008

Убедитесь, что сборка GAC и локальная сборка имеют разные номера версий (неплохая идея, чтобы позволить вашему номеру сборки, по крайней мере, с автоматическим приращением путем подстановки вашего AssemblyVersion в AssemblyInfo: [assembly: AssemblyVersion ("1.0.0 . * ")]). Затем перенаправьте привязку сборки, используя конфигурацию вашего приложения:

В вашем случае вам не понадобится атрибут "applyTo" конфигурации AssemblyBinding. Вам просто нужно что-то вроде:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="YourAssembly" publicKeyToken="AAAAAAAAAAAA" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-5.2.1.0" newVersion="5.0.8.1"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>
27 голосов
/ 06 ноября 2008

Если у них одинаковый номер версии, вы не можете ответить. Если вы попытаетесь загрузить сборку, которая имеет такое же полное имя сборки (имя, версия, ключ), что и сборка GAC, CLR будет выбирать сборку GAC каждый раз.

10 голосов
/ 24 июня 2009

Вы можете установить DEVPATH для принудительной загрузки сборки, см. текст ссылки

Это не отвечает на ваш вопрос, так как оно предназначено только для использования в разработке и даже тогда не очень рекомендуется, поскольку не отражает использование в производстве. Однако я думал, что поделюсь этим в любом случае, так как это полезно знать

1 голос
/ 08 августа 2014

У меня была похожая проблема. Я изменил publicKeyToken целевой библиотеки DLL, используя ildasm и ilasm для создания новой библиотеки DLL. Затем я обновил его в ссылке на проект, чтобы указать на новую DLL. Я сделал следующие шаги: здесь .

Это сработало для меня.

1 голос
/ 06 ноября 2008

Вы пробовали Assembly.LoadFromFile ()? Это ручная работа, но она должна загружать вашу сборку в память до того, как она понадобится. Затем .NET будет использовать тот, который находится в памяти, вместо того, чтобы охотиться за ним.

Другой способ был бы, если бы локальная сборка была без знака, вы могли бы дифференцировать ее таким образом.

Rob

0 голосов
/ 11 октября 2018

Одной из причин того, что перенаправление привязки не работает, является то, что поставщик Oracle.ManagedDataAccess имеет другой порядок поиска для DLL, чем неуправляемый поставщик. Неуправляемый поставщик запускается в каталоге приложения, затем просматривает путь dll в реестре, затем путь dll в machine.config, затем путь dll в web.config. Согласно документации Oracle, порядок поиска для управляемого провайдера работает следующим образом:

Управляемый драйвер будет ссылаться на эти сборки, используя следующий порядок поиска:

  1. Глобальный кэш сборок
  2. Каталог bin веб-приложения или каталог EXE-приложения Windows
  3. Подкаталог x86 или x64 в зависимости от того, работает ли приложение в 32-битной или 64-битной .NET Framework. Если приложение построено с использованием AnyCPU, то ODP.NET будет использовать правильную битность DLL, пока доступна сборка. Oracle рекомендует использовать этот метод поиска зависимых сборок, если ваше приложение AnyCPU.

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/odpnt/installODPmd.html#GUID-0E834EC7-21DF-4913-B712-2B0A07FD58FD

Таким образом, способ решения этой проблемы - отменить регистрацию сборки GAC ИЛИ просто вставить другую версию Oracle.ManagedDataAccess в ваш bin и web.config, чем в GAC, если вы не можете удалить ее.

...