Почему мое приложение всегда использует последнюю версию GAC вместо указанной версии?
-
13-12-2019 - |
Вопрос
Контекст
У меня есть 2 разные версии сборки, установленные в GAC, версии 1.0 и 2.0.Я создал приложение, которое ссылается на 1.0 как на конкретную версию.
Проблема
Когда я запускаю свое приложение, оно всегда загружает версию 2.0, тогда как приложение конкретно ссылается на версию 1.0.
Вопрос
Почему это происходит?Как я могу заставить свое приложение загрузить версию, для которой оно было скомпилировано?
Мне не кажется, что это имеет какое-либо отношение к перенаправлению привязки, поскольку мое приложение даже не знало о версии 2.0, когда я его создавал, и что для метаданных ссылки "Конкретная версия" установлено значение true.
Спасибо.
Редактировать:
Сборка, на которую я ссылаюсь, на самом деле является Oracle.Доступ к данным из пакета ODAC.Я заметил, что другие сборки с именем Policy.x.xxx.Oracle.DataAccess были опубликованы в GAC.
Правка 2:
Изучив Oracle.Политика доступа к данным, я нашел конфигурацию, определяющую перенаправление привязки:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
<bindingRedirect oldVersion="4.112.0.0-4.112.3.0" newVersion="4.112.3.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Несмотря на то, что я добавил перенаправление обратной привязки в конфигурацию своего приложения, политика в GAC, похоже, имеет приоритет.Я нашел Статья в MSDN рассматривая тему и предлагая игнорировать политику с такой конфигурацией:
<publisherPolicy apply="no" />
Но это все равно не работает...
Правка 3:
Я попытался удалить политику из GAC и перезагрузил свой компьютер.Наконец-то это сработало.Это не похоже на удобную разработку решения, но эта политика действительно сломала одно из моих приложений, что означает, что отключение политики - это правильное решение в моем случае.
Окончательное редактирование:
Игорь дал мне правильный ответ.Все, что мне нужно было сделать, чтобы обойти эти политики, - это использовать publisherPolicy
настройка в нужном разделе конфигурации:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
<publisherPolicy apply="no"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
Решение
После того, как вы отредактировали свой вопрос, становится ясно, что это файл политики, который влияет на привязку сборки.
В случае Oracle есть файл с именем Policy.X.Y.Oracle.DataAccess.config с содержимым, подобным этому:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
<bindingRedirect oldVersion="10.1.0.000-10.2.0.100" newVersion="10.2.0.100"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Политика устанавливается программой установки Oracle и перенаправляет Oracle.DataAccess.dll
до последней версии, поскольку Oracle считает, что библиотека обратно совместима.
Редактировать:Если вы не хотите, чтобы применялась политика издателя для конкретной сборки, поместите элемент в элемент:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly" publicKeyToken="..." culture="en-us" />
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
<publisherPolicy apply="no" />
</dependentAssembly>
</assemblyBinding>