Windows Server 2012上Oracle.ManagedDataAccess DLL版本兼容问题
.NET 4.5 Web服务部署到Windows Server 2012时Oracle.ManagedDataAccess.EntityFramework版本匹配循环问题
问题背景
原本连接Oracle 11g正常的.NET 4.5 Web服务,在数据库升级到19c后同步更新了Oracle.ManagedDataAccess与Oracle.ManagedDataAccess.EntityFramework版本,本地运行无异常,但部署到Windows Server 2012时出现版本不匹配的循环错误:修改配置版本为6.122.1.0时,系统提示需要6.121.2.0;改回6.121.2.0后,又要求6.122.1.0。
错误详情
服务器错误:System.IO.FileLoadException: 无法加载文件或程序集“Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342”或其依赖项之一。找到的程序集清单定义与程序集引用不匹配。(异常来自 HRESULT: 0x80131040)
当前Web.config配置片段
<configSections> <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </configSections> <providers> <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </providers>
解决方案
1. 检查服务器GAC中的冲突版本
- 打开服务器的GAC目录:
C:\Windows\Microsoft.NET\assembly\GAC_MSIL,查看Oracle.ManagedDataAccess和Oracle.ManagedDataAccess.EntityFramework文件夹下的版本,若同时存在6.121.2.0和6.122.1.0两个版本,会导致加载混乱。 - 使用VS命令提示符执行命令查看已安装版本:
gacutil /l Oracle.ManagedDataAccess.EntityFramework - 卸载冲突版本(替换
xxx为具体版本号):gacutil /u Oracle.ManagedDataAccess.EntityFramework,Version=xxx,PublicKeyToken=89b483f429c47342
2. 添加程序集绑定重定向
在Web.config的<runtime>节点下添加重定向规则,强制所有引用指向部署的目标版本(以6.122.1.0为例):
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Oracle.ManagedDataAccess.EntityFramework" publicKeyToken="89b483f429c47342" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.122.1.0" newVersion="6.122.1.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.122.1.0" newVersion="4.122.1.0" /> </dependentAssembly> </assemblyBinding> </runtime>
3. 验证部署的DLL版本一致性
- 登录服务器,进入部署目录的
bin文件夹,右键点击Oracle.ManagedDataAccess.EntityFramework.dll,选择「属性」→「详细信息」,确认文件版本与Web.config配置、绑定重定向的版本完全一致。 - 若版本不一致,重新发布项目,确保项目引用中
Oracle.ManagedDataAccess和Oracle.ManagedDataAccess.EntityFramework的「复制本地」属性设为True。
4. 检查服务器machine.config配置
- 打开服务器的machine.config文件(32位:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config;64位:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config)。 - 查看是否存在旧版本的
oracle.manageddataaccess.client配置节或程序集绑定,若有则注释或更新为目标版本。
5. 确认本地项目引用版本匹配
在本地项目中,右键查看Oracle.ManagedDataAccess和Oracle.ManagedDataAccess.EntityFramework的引用属性,确保两个库的版本对应(Oracle EF库版本通常与主库版本匹配,如4.122.1.0对应6.122.1.0),且「复制本地」均设为True。
内容的提问来源于stack exchange,提问作者Jure
相关产品推荐
相关产品推荐

