必须换用Oracle.ManagedDataAccess,因其纯托管、不进GAC、免客户端安装,彻底规避Oracle.DataAccess的GAC版本冲突;后者即使配置bindingRedirect仍强制加载GAC中首个匹配PublicKeyToken的版本,导致manifest不匹配异常。
直接换掉 oracle.dataaccess,别试图用 bindingredirect 修它——gac 里的版本冲突根本绕不过去,oracle.manageddataaccess 是唯一能彻底甩开这个问题的路径。
为什么 bindingRedirect 对 Oracle.DataAccess 无效
Oracle.DataAccess 的加载机制绕过了 .NET 的常规绑定策略。即使你在 app.config 里写了完整的 bindingRedirect,运行时仍会按 GAC 中第一个匹配 PublicKeyToken=893fc270890156fa 的版本加载,不管 version 多旧或多新。这不是配置写错了,是 ODP.NET 自身设计决定的。
- 报错典型形式:
System.IO.FileLoadException,提示 “manifest definition does not match the assembly reference” - 查 GAC 当前状态:执行
gacutil -l Oracle.DataAccess - 必须逐条卸载,哪怕只差一个小版本号:
gacutil -u "Oracle.DataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=893fc270890156fa" - 注意平台差异:x64 程序要清
%windir%\Microsoft.NET\assembly\GAC_64,x86 清GAC_32
迁移到 Oracle.ManagedDataAccess 的关键动作
它不进 GAC,不碰 PATH,不读 tnsnames.ora(除非你手动设 OracleConfiguration.TnsAdmin),所有依赖都在项目内闭环。但迁移不是加个 NuGet 就完事。
- 卸载所有
Oracle.DataAccess引用,包括项目引用和 GAC 残留 - 替换命名空间:
using Oracle.DataAccess.Client→using Oracle.ManagedDataAccess.Client - NuGet 安装选对包:
Oracle.ManagedDataAccess.Core(.NET Core / .NET 5+)或Oracle.ManagedDataAccess(.NET Framework),二者不能混用 - EF Core 用户额外加
Oracle.EntityFrameworkCore,版本必须与驱动严格对应(如 EF Core 7.x 对应 ODP.NET 3.21.x)
连接字符串里哪些参数漏了就连不上
托管驱动表面“免安装”,实则对协议参数更敏感。漏掉关键项不会报“找不到客户端”,而是静默超时或抛 ORA-12537、ORA-24247 这类模糊错误。
- Oracle 9i/10g:
ENCRYPTION=REQUIRED;CryptoProtocolVersion=1.0(缺了握手直接超时) - Oracle 12c+(尤其 12.2 起):
SSL_VERSION=TLSv1.2;SSL_SERVER_DN_MATCH=yes - 服务端启用了
SQLNET.ENCRYPTION_SERVER=REQUIRED?那连接字符串里必须有ENCRYPTION=REQUIRED,否则报ORA-28759 - 别依赖
Data Source=ORCL这种简写——它需要sqlnet.ora+ EZCONNECT,.NET 下极易失效
.NET Core 下配置文件怎么写才生效
oracle.manageddataaccess.client 配置节只在 .NET Framework 有效;.NET Core / .NET 5+ 完全不识别它,写了也白写。
- 连接字符串必须从
appsettings.json的ConnectionStrings段读取,或硬编码传入OracleConnection - 要用 TNS 别名?得自己实现映射逻辑,或设环境变量
TNS_ADMIN指向含tnsnames.ora的目录 -
TraceFile、Statement Cache Size等诊断或性能参数,只能通过连接字符串传,比如Statement Cache Size=0 - 所有 XML 配置(如
<dataSources>)在 .NET Core 中完全被忽略
最常被忽略的点是:驱动版本和数据库版本之间的加密协议对齐。不是“装上就能连”,而是“连得上才算配对成功”。尤其跨大版本(比如用新版驱动连老库),参数错一个,就卡在 TLS 握手阶段,日志里看不到明确提示,只等超时。


















