C#中的引用:运行时引用缺失或不匹配问题的常见实例有哪些
C# 运行时依赖故障常见场景及实例
编译阶段仅校验代码直接调用的公开API签名、类型是否匹配引用的程序集,不会校验依赖的完整性、版本一致性、间接依赖和运行时兼容性,这些校验都在CLR运行加载程序集时才会执行,因此经常出现编译通过但运行报错的情况,以下是常见的实际场景:
- 直接依赖程序集发布遗漏
场景:开发阶段项目显式引用了Newtonsoft.Json,编译完全正常,但发布时手动修改了依赖的复制本地属性为False,或者打包时遗漏了Newtonsoft.Json.dll,仅将主程序EXE上传到服务器。
运行现象:程序首次调用Json序列化/反序列化方法时,抛出FileNotFoundException,明确提示无法加载对应版本的Newtonsoft.Json程序集。 - 依赖版本不匹配
场景:开发时引用的是Newtonsoft.Json 13.0.1,代码中用到了13.0版本新增的JsonConvert.SerializeObject重载方法,部署时服务器GAC(全局程序集缓存)中已安装的Newtonsoft.Json版本为12.0.1,CLR会优先加载GAC中的低版本程序集。
运行现象:调用到对应重载方法时抛出MissingMethodException,提示方法签名不存在。 - 间接依赖缺失
场景:你的项目仅显式引用了第三方SDK的WeChatSDK.dll,而WeChatSDK.dll本身依赖System.Security.Cryptography.Xml.dll,你的代码中没有直接调用后者的任何API,因此项目没有显式引用这个间接依赖。
运行现象:编译完全无报错,运行时首次调用微信支付相关接口时,抛出FileNotFoundException提示找不到System.Security.Cryptography.Xml.dll。 - 程序集架构/运行时不兼容
场景:你开发的是基于x86架构的.NET 6桌面应用,引用了一个仅支持x64架构、目标框架为.NET Framework 4.8的硬件驱动类库,编译时因开启了程序集兼容校验忽略,没有抛出报错。
运行现象:调用驱动类库方法时抛出BadImageFormatException或TypeLoadException。
内容的提问来源于stack exchange,提问作者yBother
相关产品推荐
相关产品推荐

