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

Dav*_*err 47 .net c# visual-studio-2012

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

我宁愿避免:

MyLibrary40.dllMyLibrary45.dll

如果可能的话,因为这两个项目必须分享很多代码.4.5版本将提供async4.5功能的功能.

有谁知道最好的办法是什么?我可以使用多个构建配置吗?或者我必须沿着单独的项目路线走?

如果我在C++中工作,我可能会使用多个配置并#if围绕仅在一个配置中支持的功能,但我担心这会导致我有两个具有相同名称的程序集执行不同的操作.

提前致谢!

Jeh*_*hof 37

您将至少需要一个包含2个项目的VisualStudio解决方案(一个用于.net 4,另一个用于.net 4.5).

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

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

另外,您应该为项目定义自己的编译器开关(条件编译符号).像.NET4一样用于.net 4项目,NET4.5用于.net 4.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
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢,这确实是我走了的路.我有一个名为'JsonClient'的.NET Framework 4.5类库,它具有所有功能..NET 4.0版本被称为'JsonClientLite'并且包含完全相同的代码,但是我没有使用条件编译,而是使用Async方法为每个类创建一个单独的文件(所以我在两个中都有JsonClient.cs,JsonClientAsync.cs仅在主要的) - 我使用.NET 4.0中的文件的快捷方式,就像你描述的那样.我很高兴这是如何工作的,这似乎是一个干净的方式 - 非常感谢你的回答! (5认同)

Dre*_*kes 15

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

说你有结构:

- MyLibrary\
  - MyLibrary.sln
  - MyLibrary\
    - MyLibrary.csproj
    - Program.cs
Run Code Online (Sandbox Code Playgroud)

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

  • <ProjectGuid> 只需为此元素的值创建一个新的GUID
  • <TargetFrameworkVersion>在此指定替代版本,例如:v4.5v3.5
  • <OutputPath>(对于Debug和Release)将其设置为一个唯一的路径,例如bin\Debug\net45bin\Debug\net45,以允许每个项目的输出结束在一个唯一的位置

您还必须向非条件<PropertyGroup>元素添加新元素,以便obj在并行构建期间两个项目不会在文件夹中发生冲突.这很重要,可以防止奇怪的竞争条件错误.

<PropertyGroup>
  <BaseIntermediateOutputPath>obj\net45\</BaseIntermediateOutputPath>
Run Code Online (Sandbox Code Playgroud)

最后,将此新项目添加到现有解决方案中.

这种方法与定义编译开关(例如NET35NET45,以及使用#if NET35/ #endif指令)密切配合.

使用此技术的两个开源项目是MetadataExtractorNetMQ.如果您遇到麻烦,可以参考它们.

  • @ORMapper如果使用接受的答案添加任何文件,您仍然需要记住在任何其他项目中链接它们. (2认同)

Ste*_*rew 5

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