.NET强命名程序集版本不匹配:VS运行正常、外部报错原因咨询
问题原因分析
这种差异是由Visual Studio调试环境的特殊行为和.NET程序集加载规则共同导致的,具体原因如下:
VS调试时优先加载项目输出目录的程序集
在VS调试控制台应用时,CLR会优先从项目的输出目录(通常是bin\Debug或bin\Release)加载依赖的类库DLL。因为你在项目中引用的是1.0.0.0版本的类库,VS会自动将该版本的DLL复制到控制台应用的输出目录中。此时CLR加载的是本地的1.0.0.0版本,完全匹配引用要求,自然不会抛出版本不匹配的异常,GAC中的2.0.0.0版本不会被加载。独立运行时的程序集加载逻辑
当你将程序集复制到其他文件夹独立运行时,通常是以下情况触发FileLoadException:
你未将1.0.0.0版本的类库DLL正确复制到目标文件夹,CLR会按照加载规则去GAC中查找该类库。此时找到的是2.0.0.0版本,与控制台应用引用的1.0.0.0版本不匹配,因此抛出异常。VS调试的影子复制机制
VS调试时默认启用影子复制(Shadow Copy)功能,会将需要加载的程序集复制到临时目录后再加载,避免锁定项目输出目录的文件。这个机制也确保了调试时加载的是项目编译生成的1.0.0.0版本,而非GAC中的其他版本。
内容的提问来源于stack exchange,提问作者Tchacks2017
相关产品推荐
相关产品推荐

