3

我知道这是一个相当普遍的问题,但我无法找到解决以下情况的可靠资源,也无法找到一个地方。所以我决定在这里问,希望能帮助其他人在同样的问题上苦苦挣扎:

作为 .NET 组件的开发人员,我希望支持各种 .NET 目标框架。随着最近引入dot net coredot net 标准的目标框架变体爆炸式增长,这个话题对我来说变得非常重要。

所以,想象一下我正在编写一个 C# 库MyLib(我将其称为“产品”),它编译为MyLib.dll. 我想支持不同范围的目标框架:net35、、、net40等。因此net45netstandard1.2我为每个目标框架创建构建(MSBuild 或 csproj 文件)并将它们捆绑在一个 nuget 包中,遵守 lib 文件夹结构的 nuget 指南. 因此,产品可以从单个构建工件——nuget 包中获得。

对于每个目标框架版本,我都尝试利用其特性和优势,并为较低版本提供 pollyfills 或剥离一些特性。一般来说,无论使用项目的目标框架如何,“产品”都是可用的——我的意思是MyLib应该正确安装 nuget 包,并且应该引用适当的 dll。

因此,出现了几个问题:

  • 在不同的构建中共享相同的程序集版本信息是否正确?喜欢重复使用同一个AssemblyInfo.cs文件?
  • 哪些程序集属性不应该在我的构建之间共享?关于] 属性,我已经开始了另一个线程。[assembly: Guid("...")]其他人也在不同的背景下表现出对该属性的担忧。[assembly: AssemblyTitle("...")]
  • 是否有任何好的或标准化的方法来组织解决方案来支持上述构建结果。大多数项目是否真的在实现这一目标时自谋生路?

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

4

1 回答 1

5

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

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

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   <TargetFrameworks>net451;netstandard1.3</TargetFrameworks>
  </PropertyGroup>
</Project>

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

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

使用新的dotnetcli,您可以dotnet pack将其全部打包到一个 nuget 包中。

于 2017-05-11T14:58:47.600 回答