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

C# 有没有可靠的(甚至是标准化的)方法来创建一个同时支持多个目标框架的.NET库?,c#,nuget-package,projects-and-solutions,target-framework,C#,Nuget Package,Projects And Solutions,Target Framework,我知道这是一个相当普遍的问题,但我还没有找到解决以下场景的可靠资源,也没有在一个地方找到。因此,我决定在这里提问,希望能帮助其他人解决同样的问题: 作为.NET组件的开发人员,我希望支持各种各样的.NET目标框架。自从最近推出了dot-net核心和dot-net标准后,目标框架变体激增,这个主题对我来说变得非常重要 因此,假设我正在编写一个C#库MyLib(我称之为“产品”),它编译成MyLib.dll。我想支持不同范围的目标框架:net35、net40、net45、netstandard1.2

我知道这是一个相当普遍的问题,但我还没有找到解决以下场景的可靠资源,也没有在一个地方找到。因此,我决定在这里提问,希望能帮助其他人解决同样的问题:

作为.NET组件的开发人员,我希望支持各种各样的.NET目标框架。自从最近推出了dot-net核心和dot-net标准后,目标框架变体激增,这个主题对我来说变得非常重要

因此,假设我正在编写一个C#库
MyLib
(我称之为“产品”),它编译成
MyLib.dll
。我想支持不同范围的目标框架:
net35
net40
net45
netstandard1.2
等等。因此,我为每个目标框架创建构建(MSBuild或csproj文件),并将它们捆绑在一个单独的nuget包中,以尊重这些框架。因此,该产品可以从单个构建人工制品(nuget包)中获得

对于每一个目标框架版本,我都试图利用它的特性和优点,并为较低版本提供pollyfill或剥离一些特性。一般来说,“产品”是可用的,不管消费项目的目标框架是什么——我的意思是
MyLib
的nuget包应该正确安装,并且应该引用适当的dll

因此,出现了几个问题:

  • 在不同的版本中共享相同的程序集版本信息是否正确?是否重复使用相同的
    AssemblyInfo.cs
    文件
  • 哪些程序集属性不应在我的生成之间共享?我已经开始考虑
    [assembly:Guid(“…”)
    ]属性。其他人在不同的上下文中也具有
    [assembly:AssemblyTitle(“…”)
    属性
  • 是否存在组织解决方案以支持上述构建结果的良好或标准化方法。大多数项目在实现这一目标时真的是自力更生吗
到目前为止,我自己的方法是为同一“产品”的每个目标框架使用一个单独的.csproj文件,但是随着开发的进展,支持多个项目可能会变得单调乏味,即使现在目标框架的数量相当大

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

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


net451;netstandard1.3
此项目同时支持.NET Framework 4.5.1和NETStandard1.3

这将自动创建条件编译符号,以便您可以执行类似于
#if NET451
#if NETSTANDARD1_3
的操作,以便您可以在需要时有条件地应用代码。您也可以在.csproj本身中这样做,只为一个框架包含nuget包。该项目在其.csproj文件中有一个这样的例子


使用新的
dotnet
cli,您可以使用
dotnet-pack
将所有内容打包成一个nuget包。

Nice!我已经在我的项目的.netstandard风格中使用了类似的东西,但是用了一种错误的方式——每个框架使用一个csproj文件。在我仍然支持
net35
的情况下,这对较旧的框架版本有效吗?此外,我在导入外部msbuild目标时遇到问题,除非我将
Sdk=“Microsoft.NET.Sdk”
添加到导入目标的根元素中,否则某些属性组将不受尊重。后者会导致MSBuild警告。您对此有什么建议吗?@IvayloSlavov您可以基于框架进行条件包含,甚至可以使用props文件在csproj文件之间共享包含。请参阅和。当然,它甚至可以与.NET2.0一起使用。有一个支持大量平台的非常彻底的例子。2) 让我看看那个。