Oracle.Dataaccess находится в GAC. Могу ли я контролировать версию, которую я использую? - PullRequest
4 голосов
/ 21 февраля 2012

У меня есть развертываемое приложение .NET XCOPY, использующее Oracle.DataAccess (ODP.NET).Мы также развернем клиент Oracle Instant в каталоге приложения.Все работает хорошо, но я волнуюсь ..

Из часто задаваемых вопросов по Oracle ODP.NET:

Начиная с ODP.NET 10.1.0.3, установщик Oracle зарегистрирует следующую политику издателяБиблиотеки DLL в глобальном кэше сборок (GAC), которые перенаправляют приложения ODP.NET 9.2, 10.1 и 10.2 для использования последней установленной версии ODP.NET: Policy.9.2.Oracle.DataAccess.dll и Policy.10.1.Oracle.DataAccess.dll

Это означает, что на машинах, где установлен Oracle ODP.NET, будет использоваться версия в GAC, а не та, которую я развернул с моим приложением.И из-за политики издателя эта версия может быть более новой, чем та, которую я развернул вместе с моим приложением.Oracle.DataAccess нуждается в клиенте Oracle (Instant), также развернутом с моим приложением.Это собственные библиотеки Win32 DLL, поэтому будет использоваться моя версия.

Возможно ли, что Oracle может обновить Oracle.DataAccess до более новой версии, которая может быть несовместима с Oracle Instant Client, развернутым с моим приложением?И, таким образом, нарушая мою заявку в будущем.

Это проблема?И можно ли этого избежать?Не устанавливая / удаляя что-либо на компьютере, я могу переопределить политику Oracle Publishers, чтобы гарантировать, что я использую версию Oracle.Dataaccess, которую я xcopy развертываю с моим приложением?

Для данной версии ODP.NET, какой OracleВерсии клиентов это поддерживает?Будут ли новые версии Oracle.DataAccess поддерживать старые версии клиента Oracle (Instant).

Ответы [ 4 ]

3 голосов
/ 22 февраля 2012

Возможно заставить ваше приложение всегда использовать нужную версию ODP и ODAC.

  1. Принудительная версия ODP: используйте трюк AssemblyBinding, опубликованный Робертом, для принудительного использования вашей версии Oracle.DataAccess вместо версии GAC. E.g.:

    <configuration>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Oracle.DataAccess"  culture="neutral" publicKeyToken="89b483f429c47342"/>
            <codeBase version="4.112.3.0" href="FILE://Oracle.DataAccess.dll"/>
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>
    
  2. Принудительная версия ODAC: DLL ODP зависит от набора общих компонентов Oracle (мгновенный клиент, неуправляемые библиотеки OCI). Один из способов получить это через пакет ODAC. Вы можете определить (для каждого приложения), какой пакет ODAC вы хотите использовать. Традиционно это делалось с помощью переменной env PATH, но теперь ее можно определить через config:

    <configuration>
      <configSections>
        <section name="oracle.dataaccess.client" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </configSections>
    
      <oracle.dataaccess.client>
        <settings>
          <add name="DllPath" value="C:\somefolder\ODAC_11.2.0.3.0_32bit\bin" />
        </settings>
      </oracle.dataaccess.client>
    </configuration>
    
  3. В качестве дополнительной меры предосторожности вы всегда можете удалить DLL-библиотеку политики издателя GAC, чтобы гарантировать, что здесь никогда не будет ничего лишнего.

1 голос
/ 25 февраля 2014

Я объединил ответ Роберта и Арве с моими предыдущими усилиями:

  • Установите для SpecificVersion значение True в свойствах проекта Oracle.DataAccess и убедитесь, что указанная версия соответствует версии, которую вы хотите использовать. Если нет, то вручную отредактируйте файл csproj, чтобы изменить номер версии и удалите скопированную dll в папке bin. Visual Studio автоматически найдет номер версии в GAC. Если версия еще не существует в GAC, сначала необходимо установить ODAC.

  • Убедитесь, что первая найденная в пути OraOps11w.dll - это версия, которую вы хотите использовать. Если нет, измените системный путь Windows, чтобы каталог Oracle Client, который вы хотите использовать, был первой записью пути.

C: \ app \ user \ product \ 11.1.0 \ client_1; C: \ app \ user \ product \ 11.1.0 \ client_1 \ bin; другой путь

  • Отключить политику издателя, применяемую в файле Web.config или App.config

  <configuration>
...
     <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
...
            <dependentAssembly>
            <assemblyIdentity name="Oracle.DataAccess"
                                    publicKeyToken="89b483f429c47342"
                                    culture="neutral" />
            <publisherPolicy apply="no"/>
            </dependentAssembly>
        </assemblyBinding>
     </runtime>
  </configuration>

Может быть, лучше закрыть Visual Studio при редактировании файлов csproj / web.config в Notepad ++ или в вашем любимом текстовом редакторе. Но обычно Visual Studio спрашивает вас, хотите ли вы перезагрузить проект или нет.

1 голос
/ 21 февраля 2012

Вы можете использовать AssemblyBinding в файле app.config.

Вот пара ссылок, которые показывают, как его использовать.

http://blogs.msdn.com/b/suzcook/archive/2004/05/14/132022.aspx http://stackoverflow.com/questions/1165190/is-there-a-way-to-force-using-a-dll-version

0 голосов
/ 24 июня 2015

Для правильной игры Oracle 11 и 12 мне пришлось внести следующие изменения в мой файл app.config. Это единственное изменение, которое я сделал, я не внес никаких изменений в файл проекта, например, изменил конкретную версию с false на true.

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>

  <!--Add This Section to run Oracle 11 and !2 side By Side  -->
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess"  culture="neutral" publicKeyToken="89b483f429c47342"/>
        <codeBase version="4.112.4.0" href="FILE://Oracle.DataAccess.dll"/>
        <publisherPolicy apply="no"/>
      </dependentAssembly>
    </assemblyBinding>

    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess"  culture="neutral" publicKeyToken="89b483f429c47342"/>
        <codeBase version="4.112.3.0" href="FILE://Oracle.DataAccess.dll"/>
        <publisherPolicy apply="no"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <!--Add the above Section to run Oracle 11 and 12 side By Side  -->

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