Подтвердить что ты не робот

Принудительно загрузить сборку из /bin, а не GAC?

У меня есть две сборки, созданные посредством условной компиляции (dev и real).

Общественная поверхность этих сборок на 100% идентична: оба они сильно названы; оба они подписаны с тем же .snk и, следовательно, имеют тот же PublicKeyToken; оба имеют одну и ту же культуру и ту же версию. Я не могу изменить это: сделать их одинаковыми - это целая точка.

Однако на моей машине реальная сборка находится в GAC. У меня есть приложение ASP.NET 3.5 WebForms, которое ссылается на сборку dev. Это абсолютно необходимо; реальная сборка сбрасывает приложение.

Есть ли способ заставить конкретное приложение ASP.NET использовать dev (который находится в /bin), учитывая, что:

  • В GAC есть один.
  • Оба имеют одинаковые Version и PublicKeyToken.
  • Оба они сильно названы/подписаны с тем же ключом.
  • Я не могу их изменить, не могу изменить версию и не могу удалить ключ.

Я заметил, что кто-то уже спросил об этом в # 991293, но принятый ответ включал удаление подписи, что здесь не вариант.

Мне повезло?

4b9b3361

Ответ 1

GAC всегда проверяется при привязке сборок: Как Runtime Locates Assemblies

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

Ответ 2

Нет никакого способа сделать это. При загрузке сборки CLR проверяет, есть ли DLL с эквивалентным сильным именем в GAC. Если в GAC имеется соответствующая сборка, она будет собирать сборку GAC каждый раз. К сожалению, нет способа отменить это поведение.

Ответ 4

Я нашел другой путь. Он предназначен только для разработчиков, но он работает. Согласно 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/ См. Это как небольшое доказательство концепции: Скриншот Process Explorer

Ответ 5

Вам нужно будет сделать что-то вроде ручной загрузки сборки из файла (Assembly.LoadFrom или Assembly.Load(byte[])) перед ее загрузкой из GAC, а затем обработать событие AppDomain.AssemblyResolve. За дополнительной информацией обращайтесь запись в блоге Suzanne Cook.