Как заставить .NET использовать локальную копию сборки, которая в GAC

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

Ответ 1

Удостоверьтесь, что в сборке GAC и локальной сборке имеются разные номера версий (не плохая идея, чтобы ваш номер сборки, по крайней мере, автоматически увеличивался с помощью wild-carding вашего AssemblyVersion в AssemblyInfo: [сборка: 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>

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

Rob

Ответ 5

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

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