是否可以有条件地编译为.NET Framework版本?

问题描述 投票:17回答:5

我可以回想起使用MFC时,可以通过检查_MFC_VER宏来支持MFC框架的多个版本。

我现在正在使用.NET 4做一些事情,想在几个地方使用Tuple,但仍然保持其他所有3.5兼容。

我正在寻找类似的东西:

#if DOTNET4
    public Tuple<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#else
    public KeyValuePair<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#endif
c# .net .net-4.0 conditional-compilation
5个回答
7
投票

没有可以使用的内置预编译器常量。但是,很容易在VS中创建自己的构建配置,每个配置都有自己定义的常量集,当然还有目标框架版本。很多人这样做是为了有条件地根据32位或64位差异进行编译。


10
投票

在.csproj(或理论上为.vbproj)中定义自定义编译符号时,需要注意的一个大警告:它们会覆盖所有先前定义的编译符号。例如,考虑MSBuild片段:

  <PropertyGroup Condition="'$(TargetFrameworkVersion)' == 'v4.0'">
    <DefineConstants>$(DefineConstants);DOTNET_40</DefineConstants>
  </PropertyGroup>
  <PropertyGroup>
    <DefineConstants>ITS_CLOBBERING_TIME</DefineConstants>
  </PropertyGroup>

第二个DefineConstants元素,如其值所建议,将破坏DefineConstants的第一个值。为避免这种情况,您需要重写第二个DefineConstants元素,使其看起来像这样:

    <DefineConstants>$(DefineConstants);ITS_CLOBBERING_TIME</DefineConstants>

此外,您希望将其放置在所有其他PropertyGroups中定义的PropertyGroup中[[after,因为Visual Studio 2010当前以这样的方式添加了自定义编译符号:它将破坏您定义的任何其他自定义编译符号如果将它们放在Visual Studio降低其定义之前。我已将此问题提交给Microsoft。您可以在Microsoft Connect上跟踪其进度。


7
投票
附带说明,您的条件编译代码会让遇到它的程序员感到沮丧。

编辑,根据评论

最好编写自己的类,这样就可以保证它将要做什么,并且不存在任何奇怪的签名或继承问题:

public class Pair<TSource, TResult> { public TSource Source { get; set; } public TResult Result { get; set; } public Pair() {} public Pair(TSource source, TResult result) { Source = source; Result = result; } // Perhaps override Equals() and GetHashCode() as well }

与往常一样,最好使用内置的东西进行权衡,而不要发布自己的代码。通常,这意味着问自己:“我可以维护并支持此代码吗?”与“开箱即用,代码是否满足我的需要?”

在这种情况下,由于不能保证您拥有Tuple<T1, T2>,因此我只编写您自己的简单代码,以便其他开发人员可以轻松进行::]


1
投票
由于您应该有不同的项目,因此可以有部分类,并且只引用每个项目所需的类,并具有特定的逻辑:

classname.cs公共部分类名{...}

classname.40.cs公共部分类名{公共元组SomeMethod(){...}}

classname.35.cs公共部分类名{公共KeyValuePair SomeMethod(){...}}


0
投票
如果使用的是.NET Core构建系统,则可以使用其预定义的符号:

#if NET40 public Tuple<TSource, TResult> SomeMethod<TSource, TResult>(){...} #else public KeyValuePair<TSource, TResult> SomeMethod<TSource, TResult>(){...} #endif

Developing Libraries with Cross Platform Tools#if (C# Reference)中记录了预定义符号的列表:

。NET Framework: NETFRAMEWORKNET20NET35NET40NET45NET451NET452NET46NET461NET462NET47NET471NET472NET48

。NET标准:

NETSTANDARDNETSTANDARD1_0NETSTANDARD1_1NETSTANDARD1_2NETSTANDARD1_3NETSTANDARD1_4NETSTANDARD1_5NETSTANDARD1_6NETSTANDARD2_0NETSTANDARD2_1] >

。NET Core:

NETCOREAPPNETCOREAPP1_0NETCOREAPP1_1NETCOREAPP2_0NETCOREAPP2_1NETCOREAPP2_2NETCOREAPP3_0
© www.soinside.com 2019 - 2024. All rights reserved.