如何解决.NET Framework 4.6.1中Roslyn的BindingRedirect失效问题
嘿,我一眼就瞅出你遇到的核心问题了——.NET Framework里程序集绑定重定向只认启动项目(也就是你的EXE)的配置文件,类库项目的app.config根本不会被进程加载,哪怕你在里面写了一堆重定向规则也白搭!这就是你手动复制4.0.1.0版本才能运行的根本原因。下面给你一步步解决的方案:
1. 把自动生成重定向的配置移到启动项目
你提到类库项目开了<AutoGenerateBindingRedirects>和<GenerateBindingRedirectsOutputType>,但这俩配置得加到EXE项目的.csproj里才有用,类库的这些设置不会帮EXE生成正确的重定向规则。操作步骤:
- 右键你的EXE项目 → 卸载项目 → 编辑.csproj
- 找到
<PropertyGroup>节点,添加(或修改):<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> - 重新加载项目,清理整个解决方案后重新生成
2. 手动合并类库的重定向规则到EXE的配置
如果自动生成还是没搞定Roslyn相关的.NET Standard兼容程序集(比如System.IO.FileSystem)的重定向,直接把类库app.config里<runtime><assemblyBinding>下的所有规则,复制到EXE项目的App.config对应的节点里。比如针对System.IO.FileSystem,你可以写死覆盖所有旧版本到你实际安装的NuGet版本:
<dependentAssembly> <assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" /> </dependentAssembly>
(记得把newVersion改成你实际安装的NuGet包版本,比如你说的4.3.0)
3. 确认Roslyn包的复制本地设置
你说Roslyn的DLL都设了本地复制,再仔细检查下:
- 右键类库项目里的
Microsoft.CodeAnalysis.CSharp等NuGet引用 → 属性 → 确保复制本地是True - 彻底删除所有项目的
bin和obj目录,重新生成,确保EXE的输出目录里有正确版本的Roslyn及其依赖DLL
4. 强制忽略发布者策略(解决MSBuild取旧版本的问题)
你提到MSBuild从VS的MSBuild扩展目录取了4.0.3.0的System.IO.FileSystem,这是因为.NET Framework 4.6.1的兼容包自带了这些程序集。可以在EXE的App.config里添加publisherPolicy设置,强制忽略发布者策略,用你指定的版本:
<dependentAssembly> <assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <publisherPolicy apply="no" /> <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" /> </dependentAssembly>
5. 用工具验证重定向是否生效
如果还是有问题,用fuslogvw.exe(程序集绑定日志查看器)排查:
- 打开VS的开发者命令提示符,直接输入
fuslogvw运行 - 勾选
启用程序集绑定失败日志(正常) - 运行你的EXE,查看生成的日志,就能清楚看到程序集加载时用了哪个版本,以及重定向规则是否被正确应用
内容的提问来源于stack exchange,提问作者Annabett

