ASP.NET Core项目为何依赖Microsoft.CodeAnalysis.VisualBasic?
我遇到了以下NuGet警告:
Warning NU1608 Detected package version outside of dependency constraint: Microsoft.CodeAnalysis.VisualBasic 4.4.0 requires Microsoft.CodeAnalysis.Common (= 4.4.0) but version Microsoft.CodeAnalysis.Common 4.8.0-3.final was resolved.
我的项目里并没有直接引用Microsoft.CodeAnalysis.VisualBasic或Microsoft.CodeAnalysis.Common这两个包。手动添加以下包引用可以解决这个警告,但我有个疑问:我的C# ASP.NET项目为什么会需要VisualBasic相关的包?
<PackageReference Include="Microsoft.CodeAnalysis.VisualBasic" Version="4.8.0-3.final" /> <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.8.0-3.final" />
补充信息
项目采用5层洋葱架构,Web项目的csproj内容如下:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <UserSecretsId>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</UserSecretsId> <StartupObject></StartupObject> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> <ItemGroup> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="9.0.0" /> <PackageReference Include="AutoMapper" Version="13.0.1" /> <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="8.0.1" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.2" /> <PackageReference Include="NPOI" Version="2.6.2" /> <PackageReference Include="KavenegarDotNetCore" Version="1.0.7" /> <PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="8.0.2" /> <PackageReference Include="Microsoft.Extensions.ApiDescription.Client" Version="8.0.2"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference Include="PersianDateTime.Core" Version="2.0.5" /> <PackageReference Include="ReflectionIT.Mvc.Paging" Version="8.0.0" /> <PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.7" /> <PackageReference Include="Stimulsoft.Reports.Web.NetCore" Version="2024.1.2" /> <PackageReference Include="Syncfusion.Xamarin.Pdf" Version="24.1.43" /> <PackageReference Include="System.Security.Cryptography.OpenSsl" Version="5.0.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\WebFrameWork\WebFramework.csproj" /> </ItemGroup> <ItemGroup> <Folder Include="Areas\" /> <Folder Include="wwwroot\js\" /> </ItemGroup> </Project>
顶层聚合项目的csproj包含以下包引用:
<FrameworkReference Include="Microsoft.AspNetCore.App" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.2" /> <PackageReference Include="Microsoft.Extensions.Identity.Core" Version="8.0.2" /> <PackageReference Include="Pluralize.NET" Version="1.0.2" /> <PackageReference Include="System.Drawing.Common" Version="8.0.2" /> <PackageReference Include="PersianDateTime.Core" Version="2.0.5" /> <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="8.0.2" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.2"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.2" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.2"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference Include="KavenegarDotNetCore" Version="1.0.7" /> <PackageReference Include="MailKit" Version="4.3.0" /> <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="8.0.2" /> <PackageReference Include="Microsoft.Extensions.Http" Version="8.0.0" />
为什么C#项目会依赖VisualBasic分析包?
这个依赖不是你的项目直接需要的,而是间接来自你引用的某个NuGet包或框架引用。从你的项目文件来看,最可能的源头是Microsoft.VisualStudio.Web.CodeGeneration.Design——这个包用于ASP.NET的代码生成(比如脚手架生成控制器、视图),它内部依赖了完整的Roslyn分析套件,其中就包含VisualBasic的分析组件,因为代码生成工具需要支持多语言场景。
另外,Microsoft.AspNetCore.App框架引用也可能间接引入这些包,但更大概率是前者导致的。
怎么彻底解决这个版本冲突警告?
你已经通过直接添加指定版本的包解决了问题,但还有更优雅的方式:
- 更新间接依赖的包:检查
Microsoft.VisualStudio.Web.CodeGeneration.Design是否有更新版本,新版本可能已经适配了更高版本的Roslyn组件,避免版本冲突。 - 使用NuGet依赖约束:在项目文件中添加版本约束,强制
Microsoft.CodeAnalysis.Common和Microsoft.CodeAnalysis.VisualBasic使用同一版本,无需手动添加包引用:<PropertyGroup> <PackageVersion> <Microsoft.CodeAnalysis.Common>4.8.0-3.final</Microsoft.CodeAnalysis.Common> <Microsoft.CodeAnalysis.VisualBasic>4.8.0-3.final</Microsoft.CodeAnalysis.VisualBasic> </PackageVersion> </PropertyGroup> - 检查其他第三方包:比如
Stimulsoft.Reports.Web.NetCore或Syncfusion.Xamarin.Pdf这类第三方组件,也可能携带旧版本的Roslyn依赖,需要确认它们是否兼容最新版本的分析包。
总结
这类版本冲突本质是NuGet依赖解析时,不同间接依赖要求同一包的不同版本导致的。直接显式指定版本或者更新源头依赖包,都能解决问题。你的C#项目本身不需要VisualBasic包,只是依赖的工具或组件需要完整的Roslyn支持。
内容的提问来源于stack exchange,提问作者Mohammad Ghaznavi

