C# 如何使用多个.net Framework for nuget包构建项目
我正在github上开发一个项目,并发布到nuget。在创建每个版本时,我必须构建多个.net框架,并将这些dll用于nuget包。有没有一种简单的方法来发布所有这些.net framework版本? 多谢各位C# 如何使用多个.net Framework for nuget包构建项目,c#,dll,frameworks,nuget,publish,C#,Dll,Frameworks,Nuget,Publish,我正在github上开发一个项目,并发布到nuget。在创建每个版本时,我必须构建多个.net框架,并将这些dll用于nuget包。有没有一种简单的方法来发布所有这些.net framework版本? 多谢各位 目标框架名字对象(TFM)兼容性 存在TFM兼容性。通常,TFM系列的较低版本与较高版本兼容。因此,可以在针对.NET Framework 4.7.1、4.7.2或4.8的项目中使用.NET Framework 4.7程序集。类似地,针对.NET标准1.2的NuGet包也可以用于针对.N
netcoreapp
和.NETFramework之间的API有很大的重叠。因此,即使存在不兼容,为了允许.NET Core应用程序使用可能不兼容的NuGet包,.NET Core SDK 2.0引入了一个称为目标回退的概念。如果项目与包不直接兼容,如果包支持一个目标回退TFM,NuGet将允许它,并发出警告。它可能会在运行时失败,因此会发出警告,但它可能会工作。对于.NET Core 3.0来说,这一点更为重要,因为开发人员在WPF和WinForms中编写桌面应用程序,希望使用提供桌面功能的.NET Framework NuGet软件包
总之,您可能不需要创建针对多个TFM的NuGet包。只需选择具有所需API的最低TFM,将其作为目标,并让TFM兼容性使其工作。但是,如果您希望使用仅在较新TFM中可用的API,同时仍支持较旧的TFM,则需要将项目和包多目标化,但同样,您可以将需要支持的TFM数量降至最低。您的包不需要netstandard1.0
、netstandard1.1
、netstandard1.2
、netstandard1.3
、netstandard2.0
和netstandard2.1
TFMs
csproj
,编译每个项目,然后创建一个nuspec
,将所有内容放在正确的位置。现在,simple有一个单一的csproj
,其中列出了您想要针对的所有TFM,并运行dotnet pack
(不要创建nuspec,)
因此,一旦安装了.NET Core SDK,就可以从Visual Studio创建.NET标准类库,或者在命令行上运行dotnet new classlib
。如果您想以.NET Framework为目标,创建.NET标准类库并不重要,因为这就是获得SDK样式项目的方式。.NET Framework类库项目模板使用不支持多目标的非SDK样式的项目。然后编辑csproj
并将netstandard2.0
更改为net472;netstandard2.0
。请注意,TargetFramework
(单数)变成了TargetFrameworks
(复数),XML元素的内容是一个以分号分隔的列表
下面是一个完整的csproj
示例,您可以从以下内容开始:
net472;netstandard2.0
真的
如前所述,一旦有了类似于此的csproj
,只需从命令行运行dotnet pack
(您也可以在Visual Studio的解决方案资源管理器中右键单击项目,然后选择pack),您将得到一个nupkg
,它将net472
和netstandard2.0
编译的程序集放在包中的正确位置
netcoreapp
和.NETFramework之间的API有很大的重叠。因此,即使存在不兼容,为了允许.NET Core应用程序使用可能不兼容的NuGet包,.NET Core SDK 2.0引入了一个称为目标回退的概念。如果项目与包不直接兼容,如果包支持一个目标回退TFM,NuGet将允许它,并发出警告。它可能会在运行时失败,因此会发出警告,但它可能会工作。对于.NET Core 3.0来说,这一点更为重要,因为开发人员在WPF和WinForms中编写桌面应用程序,希望使用提供桌面功能的.NET Framework NuGet软件包
总之,您可能不需要创建针对多个TFM的NuGet包。只需选择最低的TFM
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0;netcoreapp3.1</TargetFrameworks>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.7">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OnlineShoppingCart\OnlineShoppingCart.csproj" />
</ItemGroup>
</Project>