【问题标题】:Can I make a preprocessor directive dependent on the .NET framework version?我可以根据 .NET 框架版本制作预处理器指令吗?
【发布时间】:2023-04-01 01:11:01
【问题描述】:

这是我想做的一个具体例子。

考虑string.Join 函数。 Pre-.NET 4.0,只有两个重载,都需要string[]参数。

从 .NET 4.0 开始,新的重载采用更灵活的参数类型,包括 IEnumerable<string>

我有一个库,其中包含一个 Join 函数,它基本上完成了 .NET 4.0 string.Join 函数的作用。我只是想知道我是否可以使这个函数的实现依赖于目标.NET 框架。如果是 4.0,它可以简单地在内部调用 string.Join。如果是 3.5 或更早版本,它可以调用自己的内部实现。

  1. 这个想法有意义吗?
  2. 如果它确实有意义,那么最合乎逻辑的方法是什么?我想我只是假设预处理器指令最有意义,因为在针对 4.0 之前的 .NET 版本时,使用 IEnumerable<string> 参数调用 string.Join 甚至不会编译 ;所以我使用的任何方法都必须在编译之前进行。 (例如,在运行时检查 Environment.Version 属性是行不通的。)

【问题讨论】:

标签: c# .net frameworks c-preprocessor preprocessor-directive


【解决方案1】:

您可以为 .NET 4.0 准备代码,并在 framework detection 的基础上为 .NET 3.5 编写类似的代码。

#if NOT_RUNNING_ON_4
public static class GuidExtensions
{
   public static bool TryParse(this string s, out Guid result)
   {
       if (s.IsNullOrEmpty())
           return null;
       try
       {
          return new Guid(s);
       }
       catch (FormatException)
       {
          return null;
      }
   }
}
#else
    #error switch parsing to .NET 4.0
#endif

把他的台词放到你的 *.csproj 中

<DefineConstants Condition=" '$(TargetFrameworkVersion)' != 'v4.0' ">NOT_RUNNING_ON_4</DefineConstants>

【讨论】:

    【解决方案2】:

    是的,我认为这是有道理的(对于您的特定情况,因为更改相对较小),但显然这种事情可能很快就会失控。

    恕我直言,最合乎逻辑的方法是为每个版本创建不同的解决方案/项目配置,然后在您的 4.0 配置中定义一个自定义符号(例如,NET40),然后将其与 @987654322 一起使用@。我不确定配置是否允许您更改运行时版本(这显然是完美的解决方案),但最坏的情况是必须手动更改版本。

    编辑:我刚刚在 Joshua 的回答中看到了链接到的答案,这似乎是一个更精简的解决方案,但无论如何我都会把它留在这里,因为严格来说,它确实回答了问题。

    【讨论】:

    • 我其实和你的想法一样,决定四处寻找,看看有没有其他选择。
    【解决方案3】:

    您可以查看 Stack Overflow 上的另一个问题,该问题说明了如何通过项目文件的 XML 设置条件常量: Detect target framework version at compile time

    然后,您可以使用它来确定是应该使用 .NET 4 重载还是您自己的库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多