Microsoft.Build.*程序集不同发行版共用15.1版本引发兼容问题
解决Microsoft.Build系列程序集版本号固定引发的GAC冲突问题
经观察,Microsoft.Build、Microsoft.Build.Framework等程序集更新后版本号不再变更,不同发行版均显示为15.1版本。当应用依赖这类库时,若全局程序集缓存(GAC)中存在同版本但不同发行版的程序集,应用会优先加载GAC中的版本,而非可执行文件目录下的预期库,最终导致类型缺失、成员找不到等运行时错误。
以下是具体解决思路:
强制绑定重定向:在应用的配置文件(如
app.config或web.config)中添加程序集绑定重定向规则,通过codeBase明确指定本地程序集路径,覆盖GAC的默认加载优先级。示例配置:<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.Build" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-15.1.0.0" newVersion="15.1.0.0" /> <codeBase version="15.1.0.0" href=".\Microsoft.Build.dll" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-15.1.0.0" newVersion="15.1.0.0" /> <codeBase version="15.1.0.0" href=".\Microsoft.Build.Framework.dll" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>限制程序集查找范围:在配置文件中通过
probing节点指定仅在当前目录查找程序集,配合禁用缓存绑定失败,减少GAC的干扰:<configuration> <runtime> <disableCachingBindingFailures enabled="true" /> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="." /> </assemblyBinding> </runtime> </configuration>强制私有部署:确保所有依赖的Microsoft.Build系列程序集与应用可执行文件同目录,在项目文件中设置
<Private>True</Private>,强制NuGet将依赖复制到输出目录。MSBuild项目引用示例:<Reference Include="Microsoft.Build, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Private>True</Private> </Reference>自定义构建修改版本(特殊场景):若自行构建Microsoft.Build源码,可修改程序集版本号或生成新的强名称密钥,避免与GAC中的版本冲突。此方法需维护自定义构建分支,仅适合非通用场景。
内容的提问来源于stack exchange,提问作者Nick Lipilin
相关产品推荐
相关产品推荐

