【问题标题】:How can I create versions of a class library in order to support multiple versions of the .NET Framework?如何创建类库版本以支持 .NET Framework 的多个版本?
【发布时间】:2012-06-15 14:42:53
【问题描述】:

我正在尝试编写一系列类库,用于组织内的多个应用程序之间。其中一些应用程序以 .NET 3.5 为目标,一些以 4.0 为目标。

我们希望提供两个版本的程序集,一个针对 3.5,一个针对 4.0,以便主机应用程序可以选择最适合它们的程序集。

3.5 和 4.0 版本之间存在一些细微差别:

  • 由于被 .NET 4.0 版本取代,某些类已被删除。
  • 添加了一些类以帮助使用 .NET 4.0 引入的类。
  • 在 4.0 版本中修改了一些类,以利用 4.0 中的一些增强线程支持。

是否有任何解决方案可以让我重新使用代码库的重叠部分并防止简单地分叉源代码树?

我的目标是生成针对其指定框架的多个版本的程序集,这些程序集可以滚动到 NuGet 包中并在我们的内部提要中公开。

【问题讨论】:

  • 3.5的用户可以升级到4.0吗?
  • 他们的结局并非没有痛苦。我必须决定是否支持多个版本是更多的痛苦。

标签: .net visual-studio-2010


【解决方案1】:

这听起来像是条件编译器指令的工作。

给你的代码加分:

#If NET35
...
#End If

和

#If NET40
...
#End If

从这里,你必须将NET35和NET40编译常量添加到你的项目中,我建议首先在配置管理器中创建自定义配置,例如DebugNET35,DebugNET40,ReleaseNET35和ReleaseNET40。创建这些配置后,您可以切换到每个配置并转到项目的高级编译选项,您可以在其中设置自定义常量 NET35 或 NET40,具体取决于当前配置。

您也可以在此对话框中设置目标框架,但它将全局设置您的框架版本。要为每个配置设置自定义目标框架,请关注Pierre's Steps。

之后,选择一个配置并编译!我已经使用这种技术为应用程序的“Demo”和“Full”版本共享相同的代码库。

希望未来版本的 Visual Studio 将包含自动定义的框架版本:https://connect.microsoft.com/VisualStudio/feedback/details/113323/include-framework-version-defines-automatically

编辑:.NET Framework 博客中有一篇新文章讨论了在 Visual Studio 2010 和 2012 中编写可移植代码库:http://blogs.msdn.com/b/dotnet/archive/2012/07/06/targeting-multiple-platforms-with-portable-code-overview.aspx,这看起来是一个更简洁的解决方案。

【讨论】:

  • 我应该注意的是,这将使您能够细粒度地控制要为特定框架包含或排除哪些代码,从方法中的单行代码到整个类。
  • 我尝试开始这样做,但遇到了一个问题:在 Visual Studio 2010 中,“目标版本”属性不是构建配置的一部分,并且是“全局" 设置项目。
  • 这些步骤很有帮助,谢谢。我很高兴能用 MSBuild 弄脏我的手,但我不得不想知道为什么这没有通过 VS 公开。也许同样的原因也没有定义类似#NET35的符号......
  • 发现此方法存在问题:NuGet 无法很好地根据配置切换框架版本。除了为特定框架版本创建项目之外,我看不到任何解决此问题的方法。
  • 添加了关于编写可移植类库的新博客文章的链接。
【解决方案2】:

可能有更好的方法来做到这一点,但我在针对不同平台时做了以下操作。 (Xbox 与使用 XNA 的 PC)

您在配置中创建了多个具有不同平台目标的 *.csproj。例如,如果它是一个项目,您将有 2 个 *.csproj 文件,一个用于 .NET 3.5,另一个用于 .NET 4.0。

在配置管理器中,您可以为每个版本设置不同的平台。 *.csproj(s) 实际上会引用相同的文件。您还可以设置构建条件符号,以便可以针对 .NET 3.5 和 .NET 4.0 定位代码片段。此外,如果您需要重写整个文件,*.csproj(s) 将引用他们自己的文件。

【讨论】:

  • 这有一些灵活的好处,可以在项目之间共享内容时非常有选择性。
  • 标记为答案,因为这是将相同的 .cs 文件定位到不同平台的最优雅的解决方案。我正在使用此解决方案在我的 .net full(MVC、WebAPI、REST 应用程序)和我的 .net core/PCL(通用 x 平台 Xamarin 应用程序)中使用接口项目。因为我的代码库必须在完整与. 核心代码库。
【解决方案3】:

如果您计划编写一系列支持多个 .NET 框架(和/或平台)的类库,您可能需要创建一个“可移植类库”。

完整的详细信息在博文Targeting Multiple Platforms with Portable Code (Overview) 中。在 Visual Studio 2012 中,您只需创建一个新的“可移植类库”项目,而在 Visual Studio 2010 中,您需要先安装 Portable Library Tools。

使用 PCL 项目,您可以针对以下平台:

  • .NET Framework 4、4.0.3 和 4.5
  • .NET 用于 Metro 风格的应用程序(我认为包括 Windows Phone 8 和 Windows 8 RT)
  • Windows Phone 7.x
  • Silverlight 4 和 5
  • Xbox 360

但是,请注意 .NET Framework 3.5 当前未包含在此列表中。编写便携式库工具以便将来可以添加其他平台,目前 Mono 支持位于列表顶部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2012-03-10
    • 1970-01-01
    • 2019-05-19
    相关资源
    最近更新 更多