C# 有没有可靠的(甚至是标准化的)方法来创建一个同时支持多个目标框架的.NET库?
我知道这是一个相当普遍的问题,但我还没有找到解决以下场景的可靠资源,也没有在一个地方找到。因此,我决定在这里提问,希望能帮助其他人解决同样的问题: 作为.NET组件的开发人员,我希望支持各种各样的.NET目标框架。自从最近推出了dot-net核心和dot-net标准后,目标框架变体激增,这个主题对我来说变得非常重要 因此,假设我正在编写一个C#库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
MyLib
(我称之为“产品”),它编译成MyLib.dll
。我想支持不同范围的目标框架:net35
、net40
、net45
、netstandard1.2
等等。因此,我为每个目标框架创建构建(MSBuild或csproj文件),并将它们捆绑在一个单独的nuget包中,以尊重这些框架。因此,该产品可以从单个构建人工制品(nuget包)中获得
对于每一个目标框架版本,我都试图利用它的特性和优点,并为较低版本提供pollyfill或剥离一些特性。一般来说,“产品”是可用的,不管消费项目的目标框架是什么——我的意思是MyLib
的nuget包应该正确安装,并且应该引用适当的dll
因此,出现了几个问题:
- 在不同的版本中共享相同的程序集版本信息是否正确?是否重复使用相同的
文件AssemblyInfo.cs
- 哪些程序集属性不应在我的生成之间共享?我已经开始考虑
]属性。其他人在不同的上下文中也具有[assembly:Guid(“…”)
属性[assembly:AssemblyTitle(“…”)
- 是否存在组织解决方案以支持上述构建结果的良好或标准化方法。大多数项目在实现这一目标时真的是自力更生吗李>
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) 让我看看那个。