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

контекст

У меня есть 2 разные версии сборки, установленные в GAC, версия 1.0 и версия 2.0. Я сделал приложение, которое ссылается на 1.0 в качестве конкретной версии.

вопрос

Когда я запускаю свое приложение, оно всегда загружает версию 2.0, тогда как приложение специально ссылается на версию 1.0.

Вопрос

Почему это происходит? Как заставить мое приложение загрузить версию, для которой оно было скомпилировано?

Мне не кажется, что это имеет какое-либо отношение к перенаправлению привязки, так как мое приложение даже не знало о версии 2.0, когда я его создавал, и что метаданные справочной "Конкретной версии" установлены в true.

Благодарю.


Редактировать:

Сборка, на которую я ссылаюсь, на самом деле является Oracle.DataAccess из пакета ODAC. Я заметил, что другие сборки с именем Policy.x.xxx.Oracle.DataAccess были опубликованы в GAC.


Изменить 2:

Изучив политику Oracle.DataAccess, я обнаружил конфигурацию, определяющую перенаправление привязки:

<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>

1 ответ

Решение

После того, как вы отредактировали свой вопрос, становится ясно, что это файл политики, который влияет на привязку сборки.

В случае Oracle есть файл с именем Policy.XYOracle.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>
Другие вопросы по тегам