49

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

我宁愿避免:

MyLibrary40.dllMyLibrary45.dll

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

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

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

提前致谢!

4

4 回答 4

39

您至少需要一个带有 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
于 2013-07-17T13:26:40.157 回答
17

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

假设您具有以下结构:

- MyLibrary\
  - MyLibrary.sln
  - MyLibrary\
    - MyLibrary.csproj
    - Program.cs

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

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

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

<PropertyGroup>
  <BaseIntermediateOutputPath>obj\net45\</BaseIntermediateOutputPath>

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

这种方法与定义编译开关如NET35andNET45和使用#if NET35/#endif指令密切相关。

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

于 2015-08-09T22:25:20.327 回答
5

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

于 2015-09-08T14:26:41.653 回答
0

如果是现在,您可以创建“SDK 样式项目”。 MSDN

于 2021-09-17T01:09:41.727 回答