多.NET版本解决方案中ServiceCollection类型重复定义问题求助
问题背景
我的解决方案包含多个不同.NET版本的项目(.NET Core 2.1、3.1及.NET 5.0),主项目为.NET 5.0,依赖其他低版本项目。编译时出现错误:
类型'ServiceCollection'同时存在于'Microsoft.Extensions.DependencyInjection.Abstractions, Version=9.0.0.0'和'Microsoft.Extensions.DependencyInjection, Version=5.0.0.1'中。
相关代码片段:
protected IServiceProvider BuildDesignTimeServiceProvider(IConfiguration configuration) { var services = new ServiceCollection(); services.Configure<List<FeatureFlag>>(configuration.GetSection("FeatureFlags")); services.AddSingleton<IFeatureFlagService, FeatureFlagService>(); return services.BuildServiceProvider(); }
主项目.csproj中的包引用配置:
<PackageReference Include="BundlerMinifier.Core" Version="3.2.449" /> <PackageReference Include="EPPlus.Core" Version="1.5.4" /> <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.15.0" /> <PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" /> <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" /> <PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.2.1" /> <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.2.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.9" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.9"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference Include="Microsoft.NETCore.App" Version="2.2.8" /> <PackageReference Include="Microsoft.NET.Sdk.Razor" Version="3.1.18" /> <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.11.1" /> <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="5.0.2" /> <PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="6.2.2" /> <PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="6.2.2" /> <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.2.2" /> <PackageReference Include="Swashbuckle.AspNetCore.SwaggerUi" Version="6.2.2" />
已尝试操作及新问题
在.csproj中直接添加指定版本的包引用:
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.2" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="5.0.0" />
执行dotnet clean、dotnet restore、dotnet build重建后,出现警告转错误:
Warning As Error: Detected package downgrade: Microsoft.Extensions.DependencyInjection.Abstractions from 9.0.2 to 5.0.0. Reference the package directly from the project to select a different version.
SFPortal.Web -> ThirdParty.Integration -> Microsoft.Extensions.Logging.Abstractions 9.0.2 -> Microsoft.Extensions.DependencyInjection.Abstractions (>= 9.0.2)
SFPortal.Web -> Microsoft.Extensions.DependencyInjection.Abstractions (>= 5.0.0)
Warning As Error: Detected package downgrade: Microsoft.Extensions.DependencyInjection.Abstractions from 6.0.0 to 5.0.0. Reference the package directly from the project to select a different version.
SFPortal.Web -> Bedrock.Membership.Standard -> PushNotificationHandler -> FirebaseAdmin 3.0.0 -> Google.Api.Gax.Rest 4.8.0 -> Microsoft.Extensions.DependencyInjection.Abstractions (>= 6.0.0)
SFPortal.Web -> Microsoft.Extensions.DependencyInjection.Abstractions (>= 5.0.0)
解决方法
1. 统一依赖包版本到.NET 5.0兼容的最高稳定版
由于.NET 5.0兼容的Microsoft.Extensions.*包最高稳定版为5.x系列,需强制统一版本:
在主项目.csproj中添加包引用时,指定5.x系列的最高兼容版本,同时针对降级警告添加NoWarn屏蔽:
<!-- 强制指定兼容.NET 5.0的最高版本 --> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.2" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="5.0.1" /> <!-- 屏蔽NU1605降级警告 --> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="5.0.0" NoWarn="NU1605" />
若条件允许,也可升级第三方依赖库到兼容.NET 5.0的版本,从根源消除版本冲突。
2. 明确指定类型的完整命名空间
在代码中直接写明ServiceCollection的完整命名空间,避免编译器歧义:
protected IServiceProvider BuildDesignTimeServiceProvider(IConfiguration configuration) { // 明确使用Microsoft.Extensions.DependencyInjection命名空间下的ServiceCollection var services = new Microsoft.Extensions.DependencyInjection.ServiceCollection(); services.Configure<List<FeatureFlag>>(configuration.GetSection("FeatureFlags")); services.AddSingleton<IFeatureFlagService, FeatureFlagService>(); return services.BuildServiceProvider(); }
3. 调整项目依赖的目标框架(可选)
若业务允许,将低版本依赖项目升级到.NET 5.0,彻底避免跨版本依赖冲突。若无法升级,确保所有依赖的Microsoft.Extensions.*包版本统一为5.x系列。
4. 添加程序集绑定重定向
在主项目的web.config或app.config中添加绑定重定向配置,强制使用指定版本的程序集:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="5.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Microsoft.Extensions.DependencyInjection" publicKeyToken="adb9793829ddae60" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-5.0.0.1" newVersion="5.0.0.1" /> </dependentAssembly> </assemblyBinding> </runtime>
5. 临时关闭警告转错误
在主项目.csproj中添加配置,将NU1605降级为警告而非错误,先保证编译通过:
<PropertyGroup> <WarningsAsErrors>$(WarningsAsErrors);!NU1605</WarningsAsErrors> </PropertyGroup>
内容的提问来源于stack exchange,提问作者Heena Padshala

