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

时间:2013-07-17 12:43:57

标签: c# .net visual-studio-2012

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

我宁愿避免:

MyLibrary40.dllMyLibrary45.dll

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

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

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

提前致谢!

3 个答案:

答案 0 :(得分:36)

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

将所有代码文件添加到.net 4项目中,在另一个项目中添加代码文件作为链接(使用"Add Existing Item..." - Dialog并选择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

答案 1 :(得分:15)

一种简单的方法是在同一文件夹中添加另一个.csproj文件,并将其配置为构建不同的框架版本。这样就不必添加文件链接,因为这两个项目基本上都是 views 在同一个文件夹结构上。

说你有结构:

- 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指令一起使用。

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

答案 2 :(得分:5)

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