Oracle .Net ManagedDataAccess 错误:无法从程序集中加载类型“OracleInternal.Common.ConfigBaseClass”

Posted

技术标签:

【中文标题】Oracle .Net ManagedDataAccess 错误:无法从程序集中加载类型“OracleInternal.Common.ConfigBaseClass”【英文标题】:Oracle .Net ManagedDataAccess Error: Could not load type 'OracleInternal.Common.ConfigBaseClass' from assembly 【发布时间】:2015-08-05 02:19:54 【问题描述】:

我有一个可以在本地、我们的开发服务器和我们的生产服务器上运行的项目。

当我尝试在测试服务器上运行它时,我收到以下错误,除了茫然地盯着我的屏幕之外,我不知道该怎么办。提示?追查问题根源的流程?

我已经为 Oracle 12.2 等安装了 NuGet 包。

无法从 程序集'Oracle.ManagedDataAccess,版本=4.121.2.0, 文化=中性,PublicKeyToken=89b483f429c47342'。说明:一个 当前 web 执行过程中发生未处理的异常 要求。请查看堆栈跟踪以获取有关 错误以及它起源于代码的位置。

异常详细信息: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。其他人都没有只使用托管驱动程序。我正在寻找一种方法来挖掘这个错误,一些关于该类型的来源和加载位置的提示。

【问题讨论】:

您是如何安装 Oracle 库的? 我的理解是,通过托管数据访问,您不需要安装 Oracle 库,指向它们的指针包含在 Web.Config 中。编辑问题以包含该信息。 我不是指 Oracle 客户端。我的意思是.NET 使用的Oracle DLL。你是怎么安装的? 我使用了标准的 NuGet 包。 “官方 Oracle ODP.NET 托管实体框架驱动程序”及其伙伴托管驱动程序。 测试服务器上的 IIS 应用程序池是否配置为使用与 dev 和 prod 中相同版本的 .net 框架?这是这类事情的常见罪魁祸首。 【参考方案1】:

您需要安装 Oracle 客户端驱动程序。 .NET 包不包含它们;它们提供了从托管世界到非托管世界的转换。驱动程序处于非托管环境中,需要正确安装。

【讨论】:

好的,有道理,但这是否意味着我需要深入研究 TNS 问题以及驱动程序版本问题? TNS 是驱动程序找出如何连接到您想要的东西的一种方式,是的。 我想将此称为答案,但它实际上并不能解决任何问题。服务器上还有其他项目使用 Oracle 连接,而不仅仅是托管项目。我该如何调试这个问题?我在哪里挖? 我认为这是错误的......有2个.NET数据访问包。托管和非托管包(是的,很棒的命名)。 “非托管”.NET 库是与本机 Oracle 互操作的 .net 库。托管 .NET 库是直接访问 Oracle 的纯托管代码,无需在执行机器上安装 Oracle 客户端。我在这里评论这个帖子的事实表明这并不是一帆风顺......【参考方案2】:

能够通过将项目中对 Oracle.ManagedDataAccess 和 Oracle.ManagedDataAccess.EntityFramework 的引用从包管理器安装的引用替换为 oracle 客户端安装程序安装的引用来修复它。版本相同,但这些 DLL 的内部版本号不同

【讨论】:

所以你说 NuGet 包不可用?那为什么要用呢?为什么它存在?是陷阱吗?我的开发机器上没有 Oracle 客户端,并且 NuGet 包工作正常。将应用程序部署到安装了 Oracle 服务器的计算机时,它会因此错误而中断。 是的,Oracle 又做了一次——他们发布了相同版本的 DLL(前 3 个数字完全相同)并更改了实现,但没有向后兼容。他们在过去(大约 5 年前)做过,所以对我来说并不奇怪。我确实使用了 Nuget 包,然后在目标服务器上我确保从 GAC 中删除 Oracle.ManagedDataAccess dll。这样,它将开始使用 DLL 的本地 (/bin) 副本。如果您在服务器上有其他应用程序使用相同的 DLL 并且依赖于它存在于 GAC 中这一事实,那么您必须小心使用这种方法。 Oracle 的支持人员建议这样做,未来的版本不应再将程序集放入 GAC。但是现在,我必须手动删除它。在非开发机器上没有 gacutil.exe,我该怎么做? 将 gacutil 复制到您的服务器或在 .NET/ver/assembly 目录中找到 DLL 并删除它们。【参考方案3】:

这个问题肯定有一些奇怪的地方。我正在本地服务器上开发一个运行良好的应用程序,但是当我将应用程序上传到我们的服务器时出现此错误。服务器安装了oracle客户端。查看此线程后,我从 oracle 客户端中复制了两个 DLL(Oracle.ManagedDataAccess.dllOracle.ManagedDataAccess.EntityFramework.dll)并替换了我的应用程序 bin 目录中的版本。这解决了问题。

【讨论】:

【参考方案4】:

您必须在 GAC (C:\Windows\Microsoft.NET\assembly...) 中删除 Oracle.ManagedDataAccess 程序集

使用命令工具gacutil删除程序集:

C:\Program Files (x86)\Microsoft SDKs\Windows\YOUR_VERSION\bin\NETFX 4.6.1 工具> gacutil /u Oracle.ManagedDataAccess

【讨论】:

这对我来说失败了,因为它说 Windows Installer 正在使用它。 所以实际上,我发现这对我有帮助,以防万一有人需要它,因为他们也有关于 Windows Installer 作为依赖项的相同错误:***.com/questions/2447306/… 基本上,转到HKEY_CURRENT_USER\Software\Microsoft\Installer\Assemblies\Global 和@987654324 @ 并从那里删除程序集,然后您可以执行 gacutil -u 命令。我不必去 HKCU 的位置——那里什么都没有——但它在 HKLM 的位置。 然后我卸载并重新安装了 Oracle Developer Tools for Visual Studio。 这个答案也解决了我的问题。以管理员身份打开 cmd,cd 到文件夹并运行“gacutil.exe /u Oracle.ManagedDataAccess”。它应该可以工作。【参考方案5】:

来自 NuGet 的Oracle.ManagedDataAccess 与安装在服务器上(通过 Oracle 客户端安装)并在 GAC 中注册的Oracle.ManagedDataAccess 之间存在冲突。

从 GAC 注销Oracle.ManagedDataAccess,您将摆脱错误:运行命令行并导航到目录:

Oracle 主页\product\version\client_64\ODP.NET\managed\x64

在那里你应该找到OraProvCfg.exe 文件。运行以下命令从 GAC 注销Oracle.ManagedDataAccess

OraProvCfg /action:ungac /providerPath:Oracle.ManagedDataAccess 

【讨论】:

Oracle 是否提供解释该问题的文档? @youzer 我不知道。 与许多其他人一样,我同意 Oracle 的版本控制是真正的罪魁祸首。也就是说,NuGet 包的 README 文件确实 明确声明 1. Un-GAC and un-configure any existing assembly (i.e. Oracle.ManagedDataAccess.dll) and policy DLL (i.e. Policy.4.121.Oracle.ManagedDataAccess.dll) for the ODP.NET, Managed Driver ...(至少对于版本 12.1.0.2)。顺便说一句,@Jan 的回答多次对我有用。 我刚收到Error: Object reference not set to an instance of an object. Oracle Providers for .NET Configuration Utility for .NET Framework 4 : Release 4.121.2.0 .... 的版权和使用信息。【参考方案6】:

正如其他人所说,您需要从 GAC 中删除 Oracle.ManagedDataAccess。

我运行 Oracle home\product\12.1.0\dbhome_1\ODP.NET\managed\x64\unconfigure.batOracle home\product\12.1.0\dbhome_1\ODP.NET\managed\x836\unconfigure.bat 并且成功了

【讨论】:

【参考方案7】:

在我的场景中,我有一个使用类库数据库实用程序的控制台应用程序。 我还必须在控制台应用程序上引用 Oracle.ManagedDataAccess,以便它可以在运行时找到 dll。 我不知道这是否是最好的方法,但对我有用。

【讨论】:

【参考方案8】:

如果无法从 GAC 中删除 DLL,请考虑获取 oracle.managedData.access 12.2.1 的下一个版本,然后将它们放在服务器上的 bin 目录中。 之后你需要在你的 web.config 文件中添加一个 assemblyBinding。

通过这种方式,您可以在运行时从 GAC 拉取 12.1.2 版本,这将解决错误。 您无需针对新版本重新编译您的应用程序。

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

【讨论】:

【参考方案9】:

我们遇到了与上述 Dylan 完全相同的问题。问题似乎出在特定的 Oracle 版本 (4.121.2.0) 上。

解决方案很简单:只需进入 Nuget 并升级到适用于 Oracle.ManagedDataAccess.Client 的 Nuget 包的下一个版本,即 4.122.1.0。

一旦我们这样做了,我们就可以混合安装或不安装 GAC Oracle 的 Oracle 客户端或无客户端环境或服务器,保留仍使用 GAC 的旧应用,并添加使用 Nuget 包的新项目。在这些博客中要求人们卸载遗留的东西总是一个坏主意——比如删除服务器上 GAC 中的 Oracle dll——当你有许多遗留依赖项的环境仍然可能引用它时。

【讨论】:

似乎是一个在其间的 4 年内解决的错误。在甲骨文上很好。 更新到正确的 NuGet 版本解决了这个问题,而无需在 GAC 中注销任何内容。【参考方案10】:

下午好

我想分享一下我是如何解决同样的错误的:

    我首先以管理员身份启动 Visual Studio 2019 cmd。

    我在 cmd 中运行了以下命令行:gacutil -u Oracle.ManagedDataAccess

基本上,此命令行将从 GAC(全局程序集缓存)中删除 Oracle 引用,这样它只会从项目中的包(nuget 安装)中获取引用,而不是从 oracle 客户端获取引用。

【讨论】:

以上是关于Oracle .Net ManagedDataAccess 错误:无法从程序集中加载类型“OracleInternal.Common.ConfigBaseClass”的主要内容,如果未能解决你的问题,请参考以下文章

ADO.NET操作Oracle问题

在 Oracle 中生成 .Net 报价

使用 .NET 批量插入到 Oracle

.NET Core 使用ODP.NET Core连接操作Oracle数据库

Oracle Net Services 配置: Error: null Oracle Net Services 配置失败。退出代码是1

EF for Oracle,dotConnect for Oracle,ODP.NET