什么';是针对.NET框架的多个版本的最佳方法

本文关键字:版本 方法 最佳 框架 NET 什么 | 更新日期: 2023-09-27 18:23:39

我正在构建一个类库,我将为它部署一个NuGet包,它允许我根据添加到的项目的.NET框架版本选择不同的程序集作为引用添加。这是一个非常好的功能,但我想知道的是,是否有可能拥有一个类库项目,并针对.NET框架的多个版本构建它?

我宁愿避免:

MyLibrary40.dllMyLibrary45.dll

如果可能的话,因为这两个项目必须共享大量代码。4.5版本将提供async功能,这是4.5的一项功能。

有人知道最好的方法是什么吗?我可以使用多个内部版本配置吗?还是我必须走单独的项目路线?

如果我在C++中工作,我可能会在一个配置中只支持的函数周围使用多个配置和#if块,但我担心这会导致我有两个同名的程序集来做不同的事情。

提前感谢!

什么';是针对.NET框架的多个版本的最佳方法

您至少需要一个带有两个项目的VisualStudio解决方案(一个用于.net 4,一个用于.net 4.5)。

将所有代码文件添加到.net 4项目,在另一个项目中,您将代码文件添加为链接(使用"Add Existing Item..."-对话框并选择Add as link

现在,您可以将.NET 4.5的所有代码和类添加到您的4.5项目.中

此外,您应该为项目定义自己的编译器开关(条件编译符号)。比如你的.net 4项目的NET4和你的.net 4.5项目的NET4.5)

您可以在项目设置中的Build->General->Conditional Compilation switches 下设置开关

在您的代码中,您可以使用以下开关为.NET 4或.NET 4.5 生成代码

#if NET4
  // code only for .NET 4
#endif
// code for all framework versions.
#if NET45
  // code only for .NET 4.5
#endif

一个简单的方法是在同一文件夹中添加另一个.csproj文件,并将其配置为构建不同的框架版本。这避免了添加文件链接,因为两个项目本质上都是同一文件夹结构上的视图

假设你有这样的结构:

- MyLibrary'
  - MyLibrary.sln
  - MyLibrary'
    - MyLibrary.csproj
    - Program.cs

MyLibrary.csproj复制到同一个文件夹并编辑以更改一些内容:

  • <ProjectGuid>只是为该元素的值创建一个新的GUID
  • <TargetFrameworkVersion>在此指定替代版本,例如:v4.5v3.5
  • <OutputPath>(用于调试和发布)将其设置为唯一路径,如bin'Debug'net45bin'Debug'net45,以允许每个项目的输出最终位于唯一位置

您还必须向非条件<PropertyGroup>元素添加一个新元素,这样在并行生成期间,两个项目就不会在obj文件夹中发生冲突。这很重要,可以防止奇怪的种族条件错误。

<PropertyGroup>
  <BaseIntermediateOutputPath>obj'net45'</BaseIntermediateOutputPath>

最后,将这个新项目添加到现有的解决方案中。

这种方法与定义编译开关(如NET35NET45)以及使用#if NET35/#endif指令协同工作。

使用此技术的两个开源项目是MetadataExtractor和NetMQ。你可以参考他们,以防遇到麻烦。

我知道这个老问题,当时这个答案不合适。。。但现在可以使用共享项目,这在逻辑上与添加项目作为链接而不是单独添加每个文件相同。

如果是现在,您可以创建"SDK风格的项目"MSDN