Oracle .Net ManagedDataAccess Ошибка: не удалось загрузить тип 'OracleInternal.Common.ConfigBaseClass' из сборки

У меня есть проект, который работает локально, на нашем сервере разработки и на нашем производственном сервере.

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

Я установил пакет NuGet для Oracle 12.2 и т. Д.

Не удалось загрузить тип "OracleInternal.Common.ConfigBaseClass" из сборки "Oracle.ManagedDataAccess, версия =4.121.2.0, культура = нейтральная, PublicKeyToken=89b483f429c47342". Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.TypeLoadException: Не удалось загрузить тип 'OracleInternal.Common.ConfigBaseClass' из сборки 'Oracle.ManagedDataAccess, версия =4.121.2.0, культура = нейтральная, PublicKeyToken=89b483f429c47342'.

Ошибка источника:

Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение. Информация о происхождении и местоположении исключения может быть идентифицирована с помощью трассировки стека исключений ниже.

Трассировки стека:

[TypeLoadException: не удалось загрузить тип 'OracleInternal.Common.ConfigBaseClass' из сборки 'Oracle.ManagedDataAccess, версия =4.121.2.0, культура = нейтральная, PublicKeyToken=89b483f429c47342'.]
Oracle.ManagedDataAccess.EntityFramework.EntityFrameworkProviderSettings.Oracle.ManagedDataAccess.EntityFramework.EFProviderSettings.IEFProviderSettings.get_TracingEnabled () +0 Oracle.ManagedDataAccess.EntityFramework.EFProviderSettings.InitializeProviderSettings () +111 Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices..ctor () +629 Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices..cctor () +28

[TypeInitializationException: инициализатор типа для 'Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices' вызвал исключение.]
Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices.get_Instance () +24

Файл Web.Config содержит следующие блоки:

  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </configSections>

А ТАКЖЕ

  <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="PVMDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=pdxcludds108.pacificorp.us)(PORT=11086))(CONNECT_DATA=(SERVICE_NAME=DDS1086.PACIFICORP.US))) " />
      </dataSources>
    </version>
  </oracle.manageddataaccess.client>
  <connectionStrings>
    <add name="OracleDbContext" providerName="Oracle.ManagedDataAccess.Client" connectionString="User Id=USERID;Password=WORKINGPASSWORD;Data Source=PVMDataSource" />
    <add name="PVMEntities" connectionString="metadata=res://*/Models.PVMModel.csdl|res://*/Models.PVMModel.ssdl|res://*/Models.PVMModel.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string=&quot;DATA SOURCE=pdxcludds108.pacificorp.us:11086/DDS1086.PACIFICORP.US;PASSWORD=XXXXXXX;PERSIST SECURITY INFO=True;USER ID=XXX&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

ПРИМЕЧАНИЕ. На этом сервере работают другие проекты, они просто используют другую версию клиента Oracle для.Net. Никто из остальных не использует только управляемый драйвер. Я ищу способ разобраться в этой ошибке, некоторый намек на то, откуда этот тип получен и загружен.

10 ответов

Существует конфликт между Oracle.ManagedDataAccess от NuGet и тот, который установлен (путем установки клиента Oracle) на сервере и который зарегистрирован в GAC.

Разрегистрировать Oracle.ManagedDataAccess из GAC, и вы избавитесь от ошибки: Запустите командную строку и перейдите в каталог:

{Oracle home}\ product \ {version} \ client_64 \ ODP.NET \ managed \ x64

Там вы должны найти OraProvCfg.exe файл. Выполните следующую команду, чтобы отменить регистрацию Oracle.ManagedDataAccess от GAC:

OraProvCfg /action:ungac /providerPath:Oracle.ManagedDataAccess 

Вы должны удалить сборку Oracle.ManagedDataAccess в вашем GAC (C: \ Windows \ Microsoft.NET \ Assembly...)

Используйте командный инструмент gacutil снять сборку:

C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ YOUR_VERSION \ bin \ NETFX 4.6.1 Инструменты> gacutil /u Oracle.ManagedDataAccess

Это удалось исправить, заменив в проекте ссылки на Oracle.ManagedDataAccess и Oracle.ManagedDataAccess.EntityFramework с тех, которые установлены менеджером пакетов, на те, которые были установлены установщиком клиента Oracle. Версии одинаковы, но номер сборки в этих библиотеках отличается

Как говорили другие, вам нужно удалить Oracle.ManagedDataAccess из GAC.

я бегу {Oracle home}\product\12.1.0\dbhome_1\ODP.NET\managed\x64\unconfigure.bat а также {Oracle home}\product\12.1.0\dbhome_1\ODP.NET\managed\x836\unconfigure.bat и это сработало

У нас была та же проблема, что и у Дилана выше. Проблема, по-видимому, связана с конкретной версией Oracle (4.121.2.0).

Решение было простым: просто войдите в Nuget и перейдите к следующей версии своего пакета Nuget для Oracle.ManagedDataAccess.Client, 4.122.1.0.

Как только мы это сделаем, мы сможем смешать клиентские или неклиентские среды Oracle или серверы с установленным GAC Oracle или без него, оставить старые приложения, которые все еще используют GAC, и добавить новые проекты, использующие пакеты Nuget. В этих блогах всегда плохая идея - просить людей удалить устаревшие вещи - например, удалить DLL Oracle из GAC на сервере - когда у вас есть среды со многими устаревшими зависимостями, которые все еще могут ссылаться на него.

If removing the DLL from the GAC is not an option, consider getting the next version of oracle.managedData.access 12.2.1 and just put them on the server in the bin directory. Afterwards you need to add an assemblyBinding to your web.config file.

This way you get arround pulling the 12.1.2 version from the GAC during runtime that will case the error. You do not need to recompile your app against the new version.

      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-12.1.2.0" newVersion="12.2.1.0" />
      </dependentAssembly>

В моем сценарии у меня есть консольное приложение, использующее утилиту базы данных библиотеки классов. Мне пришлось ссылаться на Oracle.ManagedDataAccess также в консольном приложении, чтобы он мог найти dll во время выполнения. Не знаю, лучший ли это подход, но у меня сработал.

В этой проблеме определенно есть что-то странное. Я разрабатывал приложение на своем локальном сервере, которое работало нормально, но получило эту ошибку при загрузке приложения на наш сервер. На сервере установлен клиент oracle. Посмотрев эту ветку я скопировал две библиотеки DLL (Oracle.ManagedDataAccess.dll & Oracle.ManagedDataAccess.EntityFramework.dll) из клиента оракула и заменил версии в моем каталоге бина приложения. Это решило проблему.

добрый день

Я хочу поделиться тем, как я решил эту же ошибку:

  1. Я начал с запуска Visual Studio 2019 cmd от имени администратора.

  2. Я выполнил следующую командную строку в cmd: gacutil -u Oracle.ManagedDataAccess

По сути, эта командная строка удалит ссылку Oracle из GAC (глобального кэша сборок), таким образом, она получит ссылку только из пакета, который находится в проекте (который устанавливает nuget), а не из клиента оракула.

Вам необходимо установить драйверы клиента Oracle. Пакеты.NET не содержат их; они предоставляют перевод из управляемого мира в неуправляемый. Драйверы находятся в неуправляемом мире и должны быть установлены правильно.

Другие вопросы по тегам