Почему мое приложение всегда использует последнюю версию GAC вместо указанной версии?

StackOverflow https://stackoverflow.com//questions/10700669

Вопрос

Контекст

У меня есть 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top