首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >微软。扩展。*版本混淆。

微软。扩展。*版本混淆。
EN

Stack Overflow用户
提问于 2019-10-01 22:25:46
回答 2查看 991关注 0票数 7

我有一个针对netstandard2.0的库,它是我在ASP.NET Core 2.2应用程序中使用的,它依赖于几个Microsoft.Extensions包。

这是我的csproj

代码语言:javascript
运行
复制
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="2.2.0" />
  </ItemGroup>

</Project>

现在,我希望能够在新的ASP.NET Core 3应用程序和现有的ASP.NET Core 2.2应用程序中使用相同的库。

查看Microsoft.Extensions.*包,它们的版本总是看起来与ASP.NET Core的发行版本相匹配。

我的选择是

  • 什么都不做..。这个包在ASP.NET Core 3应用程序中还能工作吗?
  • 将包升级到它们的3.0等价物。这个包在ASP.NET Core 2应用程序中还能工作吗?
  • 保留现有包(用于ASP.NET Core 2.2应用程序),但使用3.0等效项创建一个新包,用于ASP.NET Core 3.0应用程序

总体问题是,作为一个库作者,Microsoft.Extensions.*包的特定版本与其在特定ASP.NET Core目标中的使用之间有什么相关性?

EN

回答 2

Stack Overflow用户

发布于 2019-10-02 03:05:01

你可以(也应该)做多目标。

对于目标netstandard2.0netstandard2.1,对于netstandard2.0引用2.x (适用于您的最低版本,ProB2.0,在2.x中不应该有中断的更改),而对于netstandard2.1,则引用3.x版本。

为什么?

因为它是一个主要的版本跳转,通常以新APi、删除旧的或方法签名的更改(换句话说:破坏更改)结束,而且由于netstandard2.1需要.NET Core3.0,所以引用它的应用程序也依赖于Microsoft.Extensions.* 3.x版本的APi曲面

若要有条件地引用包,请执行

代码语言:javascript
运行
复制
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
     <PackageReference Include="Microsoft.Extensions.Logging" Version="2.0"/>
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.1' ">
     <PackageReference Include="Microsoft.Extensions.Logging" Version="3.0"/>
</ItemGroup>

另一个选择

代码语言:javascript
运行
复制
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0" Condition=" '$(TargetFramework)' == 'netstandard2.01' "/>
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.0" Condition=" '$(TargetFramework)' == 'netstandard2.1' "/>

也很有效,但它的可读性较差。这仍然会创建一个NugetPackage,但是它将有两个文件夹( netstandard2.0netstandard2.1 ),其中有两个单独编写的针对不同版本的程序集。

当这个包在.NET Core3上恢复时,它将使用netstandard2.1版本,如果在.NET Core2.x上恢复,它将使用netstandard2.0

如果存在api差异,则必须在代码中使用预处理指令。

代码语言:javascript
运行
复制
#if NETSTANDARD2_0
    // API call of 2.x library
#elif NETSTANDARD2_1
    // Api call of 3.x library
#endif
票数 1
EN

Stack Overflow用户

发布于 2019-10-02 05:57:36

关于你的选择:

什么都不做..。这个包在ASP.NET核心3应用程序中还能工作吗?

不能给出确切的答案,这取决于目标框架中的类可用性,您可以在.NET API浏览器中签入所有.NET版本

将软件包升级到其3.0等价物。这个包在ASP.NET核心2应用程序中还能工作吗?

不,当您针对更高版本时,它也将尝试安装来自更高版本框架的所有相关依赖项,这将造成许多混乱。

保留现有的包(对于ASP.NET Core2.2应用程序),但是使用ASP.NET Core3.0应用程序中使用的3.0等价物创建一个新包

这可以解决问题,但这不是一个实际的解决方案,你将加倍的工作,当你工作的任何更新。

如前所述,您可以执行多个目标nuget包(只在需要特定于框架的依赖项时才考虑此选项)。

@曾已经解释了条件目标,我将只添加针对.NET核心3的目标,因为您可能只需要添加框架引用的大多数nuget包已经包含在核心3框架中。如下所示:

代码语言:javascript
运行
复制
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
    <FrameworkReference Include="Microsoft.AspNetCore.App" Version="3.0.0" Exclude="Build,Analyzers" />
</ItemGroup>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58193023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档