.NET 4.7转ASP.NET Core 6后C#调用C++ DLL遇BadImageFormatException
解决.NET Core 6.0中引用C++/CLI DLL的BadImageFormatException问题
问题概述
将多项目从.NET 4.7升级至ASP.NET Core 6.0后,引用C++/CLI编译的DLL时出现以下错误:
System.BadImageFormatException: 'Could not load file or assembly 'Tradante.MT4.Wrapper, Version=1.0.8369.22669, Culture=neutral, PublicKeyToken=null'. Format of the executable (.exe) or library (.dll) is invalid.'
排查架构兼容问题后无效,且Web应用强制设置x64编译后,启用原生调试时仍标注(Win32),疑似架构未生效。
解决步骤
1. 严格对齐C++/CLI项目与Web应用的架构配置
即使表面设置一致,仍需检查C++项目的深层配置:
- 右键C++项目 → 属性 → 配置属性 → 常规:
- 确认平台工具集为v143或更高版本(需支持.NET Core)
- 目标框架选择
net6.0-windows(C++/CLI在.NET Core下依赖Windows目标框架)
- 配置属性 → 高级:
- 目标架构设置为与Web应用完全一致的x64(或x86,不可交叉)
- 确认CLR支持已设置为
clr:netcore
2. 强制Web应用架构设置生效
消除(Win32)标注的关键操作:
- 右键Web应用 → 属性 → 生成:
- 平台目标选择x64,取消勾选"首选32位"(该选项默认勾选会强制x86运行)
- 编辑Web应用的
.csproj文件,添加强制配置:<PropertyGroup> <PlatformTarget>x64</PlatformTarget> <Prefer32Bit>false</Prefer32Bit> </PropertyGroup> - 清理解决方案,删除所有
bin/obj目录后重新编译
3. 确保DLL引用路径正确
- 避免手动复制DLL,直接添加C++项目的项目引用,确保编译时自动将对应架构的DLL复制到Web应用输出目录
- 检查Web应用的输出目录,确认存在的是x64版本的C++ DLL,而非旧的x86版本
4. 调试配置校验
启用原生代码调试时,确认以下设置:
- 右键Web应用 → 属性 → 调试:
- 调试器类型选择混合(托管和原生)
- 确认目标架构为x64
- 打开解决方案的配置管理器,确保所有项目的活动解决方案平台统一为x64,且每个项目的平台设置与活动平台匹配
内容的提问来源于stack exchange,提问作者Lorenzo Vettori
相关产品推荐
相关产品推荐

