Azure DevOps CI构建VB项目时vbc.exe.config绑定配置错误排查
我有一个包含VB Web项目和C# Web项目的解决方案,两者均通过NuGet和packages.config引入了Microsoft.CodeDom.Providers.DotNetCompilerPlatform 3.6.0与Microsoft.Net.Compilers 4.2.0。部署至服务器时,C#项目的vbc.exe.config包含正确的绑定重定向,而VB项目的绑定重定向为不匹配的较新版本(与bin目录roslyn文件夹中的DLL不一致)。两个项目均以.NET Framework 4.8为目标框架,这导致ASPX文件动态编译失败,vbc.exe无法加载引用的程序集。本地使用VS 2022(17.4.3)构建两个项目均正常,请问是什么原因导致VB项目引入错误的vbc.exe.config?
原因1:VB项目编译器版本优先级冲突
VS构建VB项目时,可能优先调用全局安装的Roslyn编译器(如VS安装目录下的MSBuild\Current\Bin\Roslyn路径),而非NuGet包指定的4.2.0版本。VB项目的编译器依赖逻辑与C#项目存在差异,全局更高版本的编译器配置会覆盖NuGet包提供的vbc.exe.config。
解决方案
在VB项目的.vbproj文件中添加以下配置,强制指定使用NuGet包内的编译器路径:
<PropertyGroup> <VbcToolPath>$(SolutionDir)packages\Microsoft.Net.Compilers.4.2.0\tools</VbcToolPath> <VbcToolExe>vbc.exe</VbcToolExe> </PropertyGroup>
添加后清理项目的bin/obj目录,重新构建部署。
原因2:绑定重定向生成配置缺失或错误
VB项目可能未正确启用绑定重定向自动生成,或配置项不完整,导致构建时生成的vbc.exe.config使用了默认系统版本的绑定规则,而非NuGet包对应的版本。
解决方案
打开VB项目的.vbproj文件,确认以下配置存在且正确:
<PropertyGroup> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup>
保存后重新构建项目,确保绑定重定向根据NuGet包依赖正确生成。
原因3:web.config中CodeDom提供者配置不匹配
VB项目的web.config中system.codedom节点的编译器配置版本与NuGet包版本不一致,导致动态编译时加载了错误版本的编译器配置文件。
解决方案
检查并修改VB项目web.config中的system.codedom节点,确保版本号与NuGet包版本(3.6.0)一致:
<system.codedom> <compilers> <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=3.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008,40000,40008 /define:_MYTYPE=\"Web\" /optionInfer+"/> </compilers> </system.codedom>
原因4:部署时旧文件残留覆盖
服务器目标目录中可能存在旧版本的vbc.exe.config或Roslyn DLL,部署过程中未被完全替换,导致VB项目使用了错误的配置文件。
解决方案
部署前彻底清空服务器上目标部署目录的所有文件,再重新部署VB项目,避免旧文件残留干扰。
内容的提问来源于stack exchange,提问作者jmoreno

