创建HttpConfiguration时CLR检测到无效程序的问题求助
问题:ApiController单元测试创建HttpConfiguration时抛出InvalidProgramException异常
测试代码
var key = HttpPropertyKeys.HttpConfigurationKey; var config = new HttpConfiguration(); //此处抛出InvalidOperationException异常 controller.Request.Properties.Add(key, config); ...
错误信息
Test method
.GetLastObject threw exception: System.InvalidProgramException: Common Language Runtime detected an invalid program.
已尝试的解决方案:
- 关闭代码优化
- 通过包管理器更新System.Web.Http库及其他相关库
上述方案均未解决问题,求以下帮助:
- 该错误的成因是什么?
- 可行的解决思路有哪些?
解答
错误成因分析
InvalidProgramException是CLR检测到不符合规范的IL代码时抛出的异常,常见触发场景包括:
- 程序集版本冲突:测试项目与主项目引用的
System.Web.Http或其依赖库版本不一致,导致加载的程序集代码不兼容 - 编译损坏:项目编译过程中生成的IL代码出错,可能由编译器bug、磁盘写入异常或项目文件损坏导致
- 混合平台问题:测试项目与主项目的目标平台(x86/x64/Any CPU)不匹配,引发运行时程序集加载错误
- 第三方工具干扰:部分测试框架、代码分析工具可能篡改CLR正常加载流程,导致IL代码异常
解决思路
- 统一程序集版本
检查测试项目和主项目的packages.config或项目文件,确保System.Web.Http、Microsoft.AspNet.WebApi.Core、System.Net.Http等相关依赖包版本完全一致,统一版本后清理并重新编译解决方案 - 清理重建项目
- 删除解决方案下所有
bin、obj文件夹 - 执行
Clean Solution后再Rebuild Solution - 若使用.NET Framework,可删除项目的
.suo隐藏文件后重新打开项目
- 删除解决方案下所有
- 对齐目标平台
右键项目→属性→生成,将测试项目与主项目的目标平台设置为一致(如统一为x64或Any CPU),避免跨平台加载冲突 - 验证测试框架兼容性
确认使用的测试框架(NUnit/xUnit/MSTest)与Web API版本兼容,尝试升级测试框架到最新稳定版 - 替换配置初始化方式
尝试使用全局配置对象替代手动新建HttpConfiguration,示例代码:var config = GlobalConfiguration.Configuration; controller.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, config); - 排查第三方工具干扰
暂时禁用测试项目中的代码分析、性能监控等第三方工具,排除其对IL代码的篡改影响
内容的提问来源于stack exchange,提问作者g1wonwon
相关产品推荐
相关产品推荐

