升级ClosedXml和DocumentFormat.OpenXml NuGet包后遇程序集加载错误
嘿,这个问题我太熟了——升级ClosedXml和OpenXml后出现的FileLoadException,本质就是程序集版本绑定不匹配搞的鬼!
你把ClosedXml从2.7.2升到2.8.1,它依赖的DocumentFormat.OpenXml也跟着升到了2.8.1,但你的项目里要么还有其他组件在偷偷引用旧的2.7.2版本,要么配置文件里没告诉CLR要统一用新的版本,导致CLR还是死磕着找2.7.2的dll,自然就报错了。
下面是一步步的解决办法:
统一所有NuGet依赖版本:打开NuGet包管理器,检查项目里所有引用
DocumentFormat.OpenXml的地方(包括直接引用和间接依赖的包),确保全部升级到2.8.1版本。如果有第三方包还依赖旧版本,可以尝试升级该第三方包,或者在NuGet里使用“强制安装”选项把OpenXml版本统一成2.8.1。手动添加/更新程序集绑定重定向:在你的
app.config(桌面应用)或web.config(Web应用)的<configuration>节点下,找到(没有就新建)<runtime>节点,添加这段配置:
<dependentAssembly> <assemblyIdentity name="DocumentFormat.OpenXml" publicKeyToken="8fb06cb64d019a17" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.8.1.0" newVersion="2.8.1.0" /> </dependentAssembly>
这段配置会告诉CLR:不管请求的是哪个旧版本的OpenXml(从0.0.0.0到2.8.1.0),都统一加载2.8.1.0版本的程序集。
清理并重建解决方案:右键点击解决方案,选择“清理解决方案”,清除所有旧的编译缓存;然后再选择“生成解决方案”,确保输出目录里的dll都是最新的2.8.1版本。
检查项目引用属性:打开项目的引用列表,找到
DocumentFormat.OpenXml,右键查看属性,确认“版本”是2.8.1,并且“复制本地”设置为True——这样编译时会把正确的dll复制到输出目录,避免引用到旧版本。
如果是.NET Core/.NET 5+项目,不需要手动配置绑定重定向,但要确保所有PackageReference里的DocumentFormat.OpenXml版本统一,最好在项目文件里明确指定版本,或者用Directory.Packages.props文件统一管理所有包的版本,避免依赖冲突。
内容的提问来源于stack exchange,提问作者Charles Bretana

