У меня есть сборка .NET, которая (по причинам, находящимся вне моего контроля) должна находиться в GAC. Однако одна и та же сборка используется другой программой, которая имеет собственную копию старой версии той же сборки. Он должен использовать свою собственную копию, а не то, что находится в GAC. Правильное управление версиями, вероятно, больше хлопот, чем в этом случае, по причинам, в которые я не буду вдаваться. Мои вопросы: все равно сказать .NET: просто используйте ЭТУ DLL, прямо здесь, в этом каталоге - игнорируйте все, что вы найдете в GAC или где-либо еще.
Как заставить .NET использовать локальную копию сборки, которая в GAC
Ответ 1
Удостоверьтесь, что в сборке GAC и локальной сборке имеются разные номера версий (не плохая идея, чтобы ваш номер сборки, по крайней мере, автоматически увеличивался с помощью wild-carding вашего AssemblyVersion в AssemblyInfo: [сборка: AssemblyVersion ( "1.0.0. *" )]). Затем перенаправьте привязку сборки с помощью конфигурации приложения:
- http://msdn.microsoft.com/en-us/library/2fc472t2(VS.80).aspx
- http://msdn.microsoft.com/en-us/library/433ysdt1(VS.80).aspx.
В вашем случае вам не понадобится атрибут "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. Шаги, которые я предпринял, здесь.
Это сработало для меня.