是否有可能有条件地编译成.NET Framework版本?(Is it possible to co

2019-07-18 15:08发布

我记得回来MFC工作时,你可以通过检查支持MFC框架的多个版本_MFC_VER宏。

我现在做的一些东西与.NET 4中,并想用元组在几个点,但仍保留一切3.5兼容。

我希望做类似:

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

Answer 1:

有迹象表明,你可以使用内置的无预编译常量。 但是,这是很容易的与有它自己的一套定义的常量,当然是一个目标框架版本的每个配置创建VS自己的构建配置。 很多人这样做是为了有条件地编译基于32倍或64位的差异。



Answer 2:

有一个重要的提醒要注意你的.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内,如Visual Studio 2010中增加了目前在定制编译符号以这样一种方式,它会揍你定义的任何其他自定义编译符号,如果他们之前放在视觉工作室砰地一声撂下了它的定义。 我已提起诉讼,这次与微软的问题。 您可以跟踪其进度在Microsoft连接 。



Answer 3:

在一个侧面说明,你的条件编译代码将挫败的是遇到它的程序员。

编辑基于评论

它可能会更好编写自己的类,这样就可以保证它会做的,你没有任何奇怪的签字或继承的问题:

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
}

一如往常,这是很好的使用内置的东西与推出自己的代码来衡量。 一般来说,这意味着问自己,“我是OK维护和支持这个代码?” 与“代码是否做什么,我需要它,开箱?”

在这种情况下,因为你不能保证有Tuple<T1, T2>我只是写自己的简单的一个,这样其他开发人员可以松一口气了:)



Answer 4:

正如你应该有不同的项目,你可以有部分类和仅供参考,你需要与他们特定的逻辑每个项目之一:

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

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

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



文章来源: Is it possible to conditionally compile to .NET Framework version?