Принудительно загрузить сборку из / bin, а не GAC? - PullRequest
26 голосов
/ 10 июня 2011

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

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

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

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

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

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

Мне не повезло?

Ответы [ 5 ]

13 голосов
/ 10 июня 2011

GAC всегда пробуется первым при привязке сборок: Как среда выполнения находит сборки

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

12 голосов
/ 10 июня 2011

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

5 голосов
/ 05 февраля 2014

Это возможно, но это продвинутое и требует ваших знаний о CLR и о том, как он работает и C ++.

Взгляните на эту книгу Google: Настройка общего языка Microsoft® .NET FrameworkВремя выполнения

Ключевые слова: IHostAssemblyManager, IHostAssemblyStore

2 голосов
/ 05 июля 2016

Я нашел другой способ.Он предназначен только для разработчиков, но работает.В соответствии с 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 screenshot

0 голосов
/ 10 июня 2011

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

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