是否有任何可靠(甚至标准化)的方法来创建同时支持多个目标框架的.NET库?

Iva*_*vov 3 c# projects-and-solutions target-framework nuget-package

我理解这是一个非常普遍的问题,但我无法找到解决以下场景的可靠资源,也不是在一个地方.所以我决定在这里问一下希望能帮助其他人解决同样的问题:

作为.NET组件的开发人员,我想支持各种.NET目标框架.这个主题对我来说非常重要,因为当引入点网核点网标准时,最近爆炸的目标框架变体.

所以,想象一下我正在编写一个C#库MyLib(我称之为"产品"),它编译成了MyLib.dll.我想支持不同范围的目标框架:net35,net40,net45,netstandard1.2对于每一个目标框架和等,因此我创建构建(或的MSBuild的csproj文件),并在单个NuGet包一起捆扎在一起,尊重的NuGet准则lib文件夹结构.因此,该产品可以从单个构造工件 - nuget包获得.

对于每个目标框架版本,我尝试利用其功能和优点,并为较低版本提供pollyfill或删除某些功能.一般来说,无论消费项目的目标框架如何,"产品"都是可用的 - 我的意思是MyLib应该正确安装nuget包,并且应该引用适当的dll.

因此,出现了一些问题:

  • 跨不同版本共享相同的程序集版本信息是否正确?喜欢重用同一个AssemblyInfo.cs文件?
  • 不应在我的构建之间共享哪些程序集属性?我已经开始了关于]属性的另一个线程[assembly: Guid("...")].其他人都显示关注的的[assembly: AssemblyTitle("...")]属性为好,而在不同的上下文.
  • 是否有任何良好或标准化的方法来组织解决方案以支持上述构建结果.那里的大多数项目真的都在为实现这个目标而自生自灭吗?

到目前为止,我自己的方法是为每个目标框架使用一个单独的.csproj文件用于相同的"产品",但随着开发的进展,支持多个项目可能会变得乏味,即使现在目标框架数量非常重要.

vcs*_*nes 5

因此,我为每个目标框架创建构建(MSBuild或csproj文件),并将它们捆绑在一个nuget包中.

如果您使用Visual Studio 2017中新的csproj"SDK"格式,那么您甚至不需要这样做 - 它支持多个目标框架.例如:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   <TargetFrameworks>net451;netstandard1.3</TargetFrameworks>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

该项目支持.NET Framework 4.5.1和NETStandard1.3.

这会自动创建条件编译符号,以便您可以执行类似的操作#if NET451,#if NETSTANDARD1_3以便在需要时有条件地应用代码.您也可以在.csproj本身中执行此操作,以便仅为一个框架包含nuget包.该小巧玲珑的项目在他们的.csproj文件中的这个例子.

使用新的dotnetcli,您可以使用dotnet pack它将所有内容打包到nuget包中.