InvalidCastException с двумя отличительными версиями ODAC - PullRequest
0 голосов
/ 24 сентября 2018

На моей машине установлен ODAC 12.1.Исходный код использует версию 12.2 (новее).

Я получаю InvalidCastException во время выполнения:

System.InvalidCastException: [A] Oracle.DataAccess.Client.OracleCommand не может быть приведен к [B] Oracle.DataAccess.Client.OracleCommand.Тип A происходит от «Oracle.DataAccess, версия = 4.121.2.0, культура = нейтральная, PublicKeyToken = 89b483f429c47342» в контексте «по умолчанию» в расположении «C: \ WINDOWS \ Microsoft.Net \ assembly \ GAC_64 \ Oracle.DataAccess \ v4».0_4.121.2.0__89b483f429c47342 \ Oracle.DataAccess.dll.Тип B происходит от «Oracle.DataAccess, версия = 4.122.1.0, культура = нейтральная, PublicKeyToken = 89b483f429c47342» в контексте «по умолчанию» в расположении «C: \ code \ Windows Application \ bin \ Debug \ Oracle.DataAccess.dll».

Как указать, какая версия Oracle должна использоваться приложением?

1 Ответ

0 голосов
/ 24 сентября 2018

Пожалуйста, посмотрите на это: [A] Oracle.ManagedDataAccess.Client.OracleParameter не может быть приведен к [B] Oracle.ManagedDataAccess.Client.OracleParameter

Однако я думаю,проблема может быть в другом.Проверьте ваш GAC , мой выглядит так:

c:\Temp>gacutil /l | findstr /i Oracle.DataAccess, | findstr Version=4.12 | sort
  Oracle.DataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64
  Oracle.DataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86
  Policy.4.112.Oracle.DataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64
  Policy.4.112.Oracle.DataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86
  Policy.4.121.Oracle.DataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64
  Policy.4.121.Oracle.DataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86

Файл политики издателя Policy.4.121.Oracle.DataAccess.config это

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
            <bindingRedirect oldVersion="4.121.0.0-4.121.2.0" newVersion="4.121.2.0"/>
        </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

Если у вас есть приложение, которое запрашиваетдля Oracle.DataAccess, Version=4.122.1.0 тогда Windows не знает, какую версию загрузить из GAC (поскольку она охватывает только до 4.121.2.0), поэтому, скорее всего, она загружает DLL, которую вы копируете, в каталог приложения.Тогда вы получите конфликт версий.

Решение 1:

Получить "старую" версию Oracle.DataAccess.dll (может быть даже старше, чем 4.121.2.0, но должна4.xxx) и скопируйте его на свою машину разработки - только одну DLL, не устанавливайте дополнительный клиент Oracle.

Сделайте ссылку на эту старую DLL.Политика издателя будет автоматически перенаправлена ​​на версию, установленную на вашем компьютере - если вы не принудительно указали конкретную версию, см. Как загрузить определенную версию сборки из GAC

Решение 2:

Выше я написал «Политика издателя будет перенаправлена ​​автоматически ...», однако это означает, что политики издателя установлены правильно!

Когда я установил клиент Oracle 12.2 последнимВремя, когда Oracle.DataAccess не было введено в GAC, также не были добавлены политики издателя.Это похоже на ошибку в Oracle Universal Installer.Вы можете добавить их вручную с помощью этого скрипта, выбрать нужную версию и архитектуру:

SETLOCAL

set Oracle_x64=c:\oracle\product\12.1\Client_x64\ODP.NET
set Oracle_x86=c:\oracle\product\12.1\Client_x86\ODP.NET

set OraProvCfg_x64=%Oracle_x64%\bin\4\OraProvCfg.exe
set OraProvCfg_x86=%Oracle_x86%\bin\4\OraProvCfg.exe


IF EXIST "%Oracle_x64%\managed\common\Oracle.ManagedDataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\managed\common\Oracle.ManagedDataAccess.dll
IF EXIST "%Oracle_x64%\managed\PublisherPolicy\4\Policy.4.121.Oracle.ManagedDataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\managed\PublisherPolicy\4\Policy.4.121.Oracle.ManagedDataAccess.dll
IF EXIST "%Oracle_x64%\managed\PublisherPolicy\4\Policy.4.122.Oracle.ManagedDataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\managed\PublisherPolicy\4\Policy.4.122.Oracle.ManagedDataAccess.dll

IF EXIST "%Oracle_x64%\bin\2.x\Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\bin\2.x\Oracle.DataAccess.dll
IF EXIST "%Oracle_x64%\PublisherPolicy\2.x\Policy.2.102.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\2.x\Policy.2.102.Oracle.DataAccess.dll
IF EXIST "%Oracle_x64%\PublisherPolicy\2.x\Policy.2.111.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\2.x\Policy.2.111.Oracle.DataAccess.dll
IF EXIST "%Oracle_x64%\PublisherPolicy\2.x\Policy.2.112.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\2.x\Policy.2.112.Oracle.DataAccess.dll
IF EXIST "%Oracle_x64%\PublisherPolicy\2.x\Policy.2.121.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\2.x\Policy.2.121.Oracle.DataAccess.dll
IF EXIST "%Oracle_x64%\PublisherPolicy\2.x\Policy.2.122.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\2.x\Policy.2.122.Oracle.DataAccess.dll

IF EXIST "%Oracle_x64%\bin\4\Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\bin\4\Oracle.DataAccess.dll
IF EXIST "%Oracle_x64%\PublisherPolicy\4\Policy.4.112.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\4\Policy.4.112.Oracle.DataAccess.dll
IF EXIST "%Oracle_x64%\PublisherPolicy\4\Policy.4.121.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\4\Policy.4.121.Oracle.DataAccess.dll
IF EXIST "%Oracle_x64%\PublisherPolicy\4\Policy.4.122.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\4\Policy.4.122.Oracle.DataAccess.dll

IF EXIST "%Oracle_x86%\bin\2.x\Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\bin\2.x\Oracle.DataAccess.dll
IF EXIST "%Oracle_x86%\PublisherPolicy\2.x\Policy.2.102.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\2.x\Policy.2.102.Oracle.DataAccess.dll
IF EXIST "%Oracle_x86%\PublisherPolicy\2.x\Policy.2.111.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\2.x\Policy.2.111.Oracle.DataAccess.dll
IF EXIST "%Oracle_x86%\PublisherPolicy\2.x\Policy.2.112.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\2.x\Policy.2.112.Oracle.DataAccess.dll
IF EXIST "%Oracle_x86%\PublisherPolicy\2.x\Policy.2.121.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\2.x\Policy.2.121.Oracle.DataAccess.dll
IF EXIST "%Oracle_x86%\PublisherPolicy\2.x\Policy.2.122.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\2.x\Policy.2.122.Oracle.DataAccess.dll

IF EXIST "%Oracle_x86%\bin\4\Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\bin\4\Oracle.DataAccess.dll
IF EXIST "%Oracle_x86%\PublisherPolicy\4\Policy.4.112.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\4\Policy.4.112.Oracle.DataAccess.dll
IF EXIST "%Oracle_x86%\PublisherPolicy\4\Policy.4.121.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\4\Policy.4.121.Oracle.DataAccess.dll
IF EXIST "%Oracle_x86%\PublisherPolicy\4\Policy.4.122.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\4\Policy.4.122.Oracle.DataAccess.dll

Конечно, вы также можете использовать gacutil.exe, если хотите.

...