Windows 10下C#项目引用Oracle.DataAccess.dll遇TypeInitializationException问题
我之前也碰到过几乎一模一样的问题,结合你的Windows 10环境、装的ODAC112012_32Bit,以及报错里的信息——找不到Oracle.DataAccess, Version=4.112.3.0,核心矛盾其实是ODAC版本和项目依赖的Oracle驱动版本不匹配,再加上32/64位的运行环境兼容问题。下面是一步步能落地的解决办法:
1. 先搞清楚ODAC版本和Oracle.DataAccess.dll的对应关系
ODAC的安装包版本和它带的Oracle.DataAccess.dll版本是严格对应的:
- ODAC 11.2.0.1.0 → 驱动版本4.112.1.0
- ODAC 11.2.0.2.0 → 驱动版本4.112.2.0
- ODAC 11.2.0.3.0 → 驱动版本4.112.3.0
你现在装的是ODAC112012(也就是11.2.0.2.0),但项目里的NexGen.FirmLoad.dll在找4.112.3.0版本,这就是根本问题。你有两个选择:要么升级ODAC到11.2.0.3.0的32位版本,要么调整项目让它用你当前已装的4.112.2.0版本。
2. 强制项目以32位模式运行
因为你装的是32位ODAC,绝对不能让项目以64位模式运行,否则肯定找不到驱动:
- 右键你的C#项目 → 点击「属性」→ 切换到「生成」标签页
- 把「平台目标」改成
x86(别选Any CPU,Windows 10是64位系统的话,Any CPU会默认以64位启动) - 如果是.NET Framework项目,记得勾选「首选32位」选项
3. 检查GAC里的驱动注册情况
ODAC安装时会把Oracle.DataAccess.dll注册到全局程序集缓存(GAC),你可以验证下:
- 以管理员身份打开命令提示符,运行
gacutil /l Oracle.DataAccess - 如果输出里没有4.112.3.0版本,说明你确实没装对应版本的ODAC,得去下载ODAC112030_32Bit安装包
- 如果已经装了但还是报错,试试重新注册驱动:找到ODAC安装目录下的Oracle.DataAccess.dll(一般在
C:\app\<你的用户名>\product\11.2.0\client_1\odp.net\bin\4\),然后运行gacutil /i "这里填dll的完整路径"
4. 用绑定重定向“骗”程序用现有版本
如果不想折腾升级ODAC,最简单的办法是在项目的app.config(桌面程序)或web.config(Web程序)里加绑定重定向,让程序把对4.112.3.0的请求转到你已装的4.112.2.0版本:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" culture="neutral"/> <bindingRedirect oldVersion="4.112.3.0" newVersion="4.112.2.0"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
这个方法亲测有效,很多时候第三方组件依赖的驱动版本和我们装的不一样,用绑定重定向就能快速解决。
5. 确认第三方组件NexGen.FirmLoad.dll的依赖
如果上面的方法都不管用,那得确认NexGen.FirmLoad.dll本身依赖的Oracle驱动版本到底是多少。你可以用Visual Studio自带的ildasm.exe工具打开这个dll,查看它的依赖项,确认版本号后再对应调整你的ODAC版本或者绑定重定向规则。
内容的提问来源于stack exchange,提问作者kanika

