У меня есть сборка .NET, которая (по причинам, находящимся вне моего контроля) должен быть в GAC. Однако одна и та же сборка используется другой программой, которая имеет собственную копию старой версии той же сборки. Он должен использовать свою собственную копию, а не то, что находится в GAC. Правильное управление версиями, вероятно, больше хлопот, чем в этом случае, по причинам, в которые я не буду вдаваться. Мои вопросы: есть в любом случае, чтобы сказать .NET: просто используйте ЭТУ DLL, прямо здесь, в этом каталоге - игнорируйте все, что вы найдете в GAC или где-либо еще.Как заставить .NET использовать локальную копию сборки, которая находится в GAC
ответ
Вы пробовали Assembly.LoadFromFile()? Это ручная работа, но вам необходимо загрузить свою сборку в память, прежде чем она понадобится. Затем .NET будет использовать память в памяти вместо того, чтобы ее искать.
Другой способ был бы, если локальная сборка была неподписанной, вы могли бы различать ее таким образом.
Роб
Убедитесь, что GAC Ассамблея и местной сборки имеют разные номера версии (не плохая идея, чтобы ваш номер сборки, по крайней мере, автоинкрементируемого по диким чесание ваш 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.
В вашем случае, вы не будете нуждаться в "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>
Можете ли вы избежать использования этого переадресации привязки, перекомпилировав приложение для использования новой версии dll или какое-то изменение конфигурации всегда необходимо? – user37078
Установка части версии вашего номера версии на '*' не делает его автоматическим приращением. Документация MSDN по [AssemblyVersionAttribute] (http://msdn.microsoft.com/en-us/library /system.reflection.assemblyversionattribute.aspx) указывает, что он должен быть случайным, но на практике Visual Studio использует количество секунд с полуночи, разделенное на 2. –
Итак, что вы говорите, каждая сборка будет переименована в каждую сборку, даже если она не имеет никаких изменений, так что мы можем нарушить зависимость от GAC? Для чего перенаправляется сборка? Единственное, что я могу придумать, это то, что его можно использовать на prod, так что если ваш проект ссылается на 5.0.8.3453 вместо 5.0.8.1 в GAC только потому, что вы повторно переигрывали его на dev без внесения изменений, это будет перенаправлен на 5.0.8.1. Это правильно? Неуклюжий, но я не вижу другого пути. –
Если у них такой же номер версии, ответ вы не можете. Если вы попытаетесь загрузить сборку с таким же полным именем сборки (имя, версия, ключ), как сборка GAC'd, CLR будет собирать сборку GAC'd каждый раз.
@downvoter, чтобы объяснить? – JaredPar
Я не знаю, кто проигнорировал это, но я испытываю то же самое, что говорит @JaredPar, и это сводит меня с ума. Он загружается из ПКК. У меня две сборки с таким же полным именем, и я хочу загрузить немного измененный. PITA. –
Вы пробовали это? http://www.aip.im/2013/04/how-to-force-iis-asp-net-to-use-assembly-from-the-bin-folder-instead-of-gac/ – Niloofar
Вы можете установить DEVPATH, чтобы заставить загрузить сборку, см link text
Это не ответ на ваш вопрос, так как он предназначен только для использования в целях развития и даже тогда на самом деле не рекомендуется, поскольку он не отражает использование продукции. Однако я думал, что поделюсь им, так как это хорошо знать.
У меня была аналогичная проблема. Я сменил publicKeyToken целевой DLL, используя ildasm
и ilasm
, чтобы сгенерировать новую dll. Затем я обновил его в ссылке на проект, чтобы указать на новую dll. Я сделал шаги here.
Это сработало для меня.
- 1. Используя локальную копию DLL-библиотеки infragistics и копию в GAC
- 2. nUnit - игнорировать копию GAC DLL
- 3. Как ссылаться на сборку, которая находится в GAC?
- 4. Не удается загрузить сборки находится в GAC
- 5. .NET сборка в GAC + Config
- 6. Установка сборной сборки в GAC
- 7. .net 4 частичное доверие сборки от GAC
- 8. Включить сборки GAC в корзину
- 9. перечисляющие сборки в GAC
- 10. Регистрация/установка сборки .NET 4 на GAC
- 11. Как переопределить сборки в GAC
- 12. Как использовать сборку .net, установленную в GAC в моем проекте
- 13. VS 2010 - Как создать MSI для развертывания сборки, которая находится в моем GAC?
- 14. Проблема сборки сборки .NET .NET
- 15. Как Windows Update устанавливает сборки .NET в GAC?
- 16. Как заставить .NET искать сборки в локальных папках сначала вместо GAC?
- 17. Wix Установка сборки в GAC
- 18. Выполнение процесса сборки независимо от GAC
- 19. Как удалить .NET сборки DLL с сервера GAC
- 20. Perl: как использовать локальную копию модуля вместо установленной версии?
- 21. Когда использовать GAC?
- 22. Установка сборки на GAC как для mono/.NET
- 23. Установка сборки .NET в GAC с использованием MSI
- 24. Использование GAC сборки необходимо разрешение
- 25. Как вернуть резервную копию twitter-bootstrap cdn в локальную копию
- 26. Как я могу заставить VS включить сборки, используемые в GAC, для копирования в выходную папку?
- 27. Как сохранить локальную копию большого файла JSON?
- 28. Исследование сборки в .net
- 29. Как заставить локальную копию изображения использовать вместо того, чтобы получать с сайта третьей стороны
- 30. Как создать локальную копию хранилища данных GAE?
Приятная идея, но нет, она не работает - LoadFile() загружает правую сборку, но когда используется ссылка на сборку, она по-прежнему загружается из GAC. :( – EMP
Нет управляемого способа загрузить локальную копию сборки GAC'd – JaredPar
Действительно неутешительно, что нет никакого способа. –