我可以根据.NET框架版本制作预处理程序指令吗?

时间:2010-12-26 22:11:03

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

这是我想要做的具体例子。

考虑string.Join功能。在.NET 4.0之前,只有两个重载,这两个重载都需要一个string[]参数。

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

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

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

3 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:2)

是的,我认为这是有道理的(因为你的具体情况,因为这种变化相对较小),但显然这种事情可能会很快失控。

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

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

答案 2 :(得分: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>