Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用多个.net Framework for nuget包构建项目_C#_Dll_Frameworks_Nuget_Publish - Fatal编程技术网

C# 如何使用多个.net Framework for nuget包构建项目

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

我正在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包也可以用于针对.NET标准2.0的项目中

    NET标准也是特殊的。它不是运行时,而是运行时实现的规范。正如我们所说,尽管.NET 4.6.1被标记为与.NET标准2.0及以下版本兼容,但仍存在一些问题,因此建议至少使用.NET Framework 4.7.2或4.8,因为它们使用的是目标.NET标准的包或项目引用

    最后,在.NETCore的运行时、
    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

  • 使用SDK样式的项目
  • 假设您使用Visual Studio进行开发,请安装.NET核心工作负载,即使您不打算进行跨平台(Linux、Mac)开发。在.NET Core中,项目文件被更改为更简单,同时功能更强大,包括内置支持在单个项目文件中定位多个TFM。以前,有必要为包中所需的每个TFM创建一个
    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
    编译的程序集放在包中的正确位置

  • 目标框架名字对象(TFM)兼容性
  • 存在TFM兼容性。通常,TFM系列的较低版本与较高版本兼容。因此,可以在针对.NET Framework 4.7.1、4.7.2或4.8的项目中使用.NET Framework 4.7程序集。类似地,针对.NET标准1.2的NuGet包也可以用于针对.NET标准2.0的项目中

    NET标准也是特殊的。它不是运行时,而是运行时实现的规范。正如我们所说,尽管.NET 4.6.1被标记为与.NET标准2.0及以下版本兼容,但仍存在一些问题,因此建议至少使用.NET Framework 4.7.2或4.8,因为它们使用的是目标.NET标准的包或项目引用

    最后,在.NETCore的运行时、
    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>