2008-11-06 1 views
62

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

ответ

1

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

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

Роб

+3

Приятная идея, но нет, она не работает - LoadFile() загружает правую сборку, но когда используется ссылка на сборку, она по-прежнему загружается из GAC. :( – EMP

+2

Нет управляемого способа загрузить локальную копию сборки GAC'd – JaredPar

+0

Действительно неутешительно, что нет никакого способа. –

43

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

В вашем случае, вы не будете нуждаться в "AppliesTo" атрибут 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

Можете ли вы избежать использования этого переадресации привязки, перекомпилировав приложение для использования новой версии dll или какое-то изменение конфигурации всегда необходимо? – user37078

+0

Установка части версии вашего номера версии на '*' не делает его автоматическим приращением. Документация MSDN по [AssemblyVersionAttribute] (http://msdn.microsoft.com/en-us/library /system.reflection.assemblyversionattribute.aspx) указывает, что он должен быть случайным, но на практике Visual Studio использует количество секунд с полуночи, разделенное на 2. –

+0

Итак, что вы говорите, каждая сборка будет переименована в каждую сборку, даже если она не имеет никаких изменений, так что мы можем нарушить зависимость от GAC? Для чего перенаправляется сборка? Единственное, что я могу придумать, это то, что его можно использовать на prod, так что если ваш проект ссылается на 5.0.8.3453 вместо 5.0.8.1 в GAC только потому, что вы повторно переигрывали его на dev без внесения изменений, это будет перенаправлен на 5.0.8.1. Это правильно? Неуклюжий, но я не вижу другого пути. –

23

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

+11

@downvoter, чтобы объяснить? – JaredPar

+1

Я не знаю, кто проигнорировал это, но я испытываю то же самое, что говорит @JaredPar, и это сводит меня с ума. Он загружается из ПКК. У меня две сборки с таким же полным именем, и я хочу загрузить немного измененный. PITA. –

+0

Вы пробовали это? http://www.aip.im/2013/04/how-to-force-iis-asp-net-to-use-assembly-from-the-bin-folder-instead-of-gac/ – Niloofar

9

Вы можете установить DEVPATH, чтобы заставить загрузить сборку, см link text

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

1

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

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

Смежные вопросы