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
相关产品推荐
相关产品推荐

