You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多.NET版本解决方案中ServiceCollection类型重复定义问题求助

解决多.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:07:10