Ответ 1
GAC всегда проверяется при привязке сборок: Как Runtime Locates Assemblies
Нет, вы не можете этого сделать. Однако, если вы объясните, почему у вас такие странные требования, может возникнуть другая проблема, о которой вы не подумали.
У меня есть две сборки, созданные посредством условной компиляции (dev и real).
Общественная поверхность этих сборок на 100% идентична: оба они сильно названы; оба они подписаны с тем же .snk
и, следовательно, имеют тот же PublicKeyToken
; оба имеют одну и ту же культуру и ту же версию. Я не могу изменить это: сделать их одинаковыми - это целая точка.
Однако на моей машине реальная сборка находится в GAC. У меня есть приложение ASP.NET 3.5 WebForms, которое ссылается на сборку dev. Это абсолютно необходимо; реальная сборка сбрасывает приложение.
Есть ли способ заставить конкретное приложение ASP.NET использовать dev (который находится в /bin
), учитывая, что:
Version
и PublicKeyToken
.Я заметил, что кто-то уже спросил об этом в # 991293, но принятый ответ включал удаление подписи, что здесь не вариант.
Мне повезло?
GAC всегда проверяется при привязке сборок: Как Runtime Locates Assemblies
Нет, вы не можете этого сделать. Однако, если вы объясните, почему у вас такие странные требования, может возникнуть другая проблема, о которой вы не подумали.
Нет никакого способа сделать это. При загрузке сборки CLR проверяет, есть ли DLL с эквивалентным сильным именем в GAC. Если в GAC имеется соответствующая сборка, она будет собирать сборку GAC каждый раз. К сожалению, нет способа отменить это поведение.
Возможно, но он расширен и требует, чтобы вы знали о CLR и как он работает, и С++.
Взгляните на эту книгу google: Настройка среды выполнения Common Language Runtime Microsoft®.NET Framework
Ключевые слова: IHostAssemblyManager, IHostAssemblyStore
Я нашел другой путь. Он предназначен только для разработчиков, но он работает. Согласно https://msdn.microsoft.com/en-us/library/cskzh7h6(v=vs.100).aspx вы установите это в свой файл .config
<configuration>
<runtime>
<developmentMode developerInstallation="true"/>
</runtime>
</configuration>
Вам также необходимо установить переменную среды DEVPATH с помощью на путь вашей DLL. Откройте cmd, установите переменную, запустите приложение:
SET DEVPATH=YOURLOCALPATH
Это помогло мне загрузить локальную Oracle.ManagedDataAccess.dll, так как Oracle выпускает новые версии, но все они имеют одну и ту же версию и PublicKeyToken. Спасибо Oracle!
Вы можете использовать Process Explorer из Microsoft, чтобы увидеть разницу. См. https://technet.microsoft.com/en-us/sysinternals/
См. Это как небольшое доказательство концепции:
Вам нужно будет сделать что-то вроде ручной загрузки сборки из файла (Assembly.LoadFrom
или Assembly.Load(byte[]
)) перед ее загрузкой из GAC, а затем обработать событие AppDomain.AssemblyResolve
. За дополнительной информацией обращайтесь запись в блоге Suzanne Cook.