You need to enable JavaScript to run this app. VS2019中ASP.NET MVC Core连接Oracle11g报Oracle.DataAccess加载错误
优惠活动
大模型
产品
解决方案
定价
更多

VS2019中ASP.NET MVC Core连接Oracle11g报Oracle.DataAccess加载错误

报错原因与缺失配置排查

本次BadImageFormatException核心是进程位数和Oracle组件位数不匹配,你目前做的配置只覆盖了部分匹配要求,以下是遗漏的配置点与排查步骤:

需补全的配置项

  • 项目编译目标必须显式指定为x86
    .NET Core项目默认采用Any CPU配置,就算勾选了「首选32位」,VS调试、内置IIS Express运行时仍可能默认启动64位进程。需打开项目属性 → 「生成」选项卡,直接将「平台目标」选择为x86,取消「首选32位」勾选,强制编译为32位程序集。
  • 修正错误的命名空间引用
    你代码中写的using Oracle.Database.Client是错误命名空间,Oracle.DataAccess.x86包对应的正确命名空间为Oracle.DataAccess.Client。命名空间错误会导致运行时优先加载GAC中注册的x64版本Oracle程序集,直接触发格式不匹配报错。
  • 排查NuGet依赖冲突
    打开项目依赖列表,确认是否同时安装了x64版本的Oracle.DataAccess、其他版本的Oracle客户端相关NuGet包,如有冲突包全部卸载,仅保留Oracle.DataAccess.x86 2.112.1.0这一个包。
  • 调整系统环境变量优先级
    将x86版Oracle 11g客户端的安装目录(默认路径一般是C:\app\<你的用户名>\product\11.2.0\client_32)添加到系统环境变量Path的最顶端,避免系统优先加载其他路径下的x64版本Oracle客户端DLL。
  • 调整IIS Express调试配置
    如果是用VS自带的IIS Express调试,需右键系统托盘的IIS Express图标 → 「选项」,取消「使用64位版本的IIS Express」的勾选,确保调试进程为32位。
  • 配置程序集加载规则
    在项目根目录的<项目名>.runtimeconfig.json文件中添加程序集重定向规则,指定优先加载NuGet包内置的本地Oracle.DataAccess.dll,避免误加载GAC中注册的全局版本程序集。

报错堆栈翻译

BadImageFormatException: 无法加载文件或程序集'Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342'。尝试加载格式不正确的程序。
MyApplication.Context.Connection.GetList()
MyApplication.Controllers.ControllerList.Index() 位于 ControllerList.cs 中
+
            List<MyList> myList= dbContext2.GetList().ToList();
lambda_method244(闭包 , 对象 , 对象[] )
Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor+SyncActionResultExecutor.Execute(IActionResultTypeMapper 映射器, ObjectMethodExecutor 执行器, 对象 控制器, 对象[] 参数)
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(引用 State 下一个状态, 引用 Scope 作用域, 引用 对象 状态, 引用 bool 是否完成)
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed 上下文)
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(引用 State 下一个状态, 引用 Scope 作用域, 引用 对象 状态, 引用 bool 是否完成)
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker 调用器, Task 前置任务, State 下一个状态, Scope 作用域, 对象 状态, 引用 bool 是否完成)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed 上下文)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(引用 State 下一个状态, 引用 Scope 作用域, 引用 对象 状态, 引用 bool 是否完成)
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker 调用器, Task 任务, IDisposable 作用域)
Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint 终结点, Task 请求任务, ILogger 日志记录器)
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext 上下文)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)

验证方法

配置完成后,直接打开项目输出目录下的Oracle.DataAccess.dll文件,右键选择「属性 → 详细信息」,确认「计算机」项显示为x86,即为配置正确。

内容的提问来源于stack exchange,提问作者JustToKnow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 13:57:08