gpt4 book ai didi

c# - 条件编译和框架目标

转载 作者:可可西里 更新时间:2023-11-01 08:30:00 26 4
gpt4 key购买 nike

如果目标框架是较新的版本,我的项目的代码可能会在一些小地方得到显着改进。我希望能够更好地利用 C# 中的条件编译来根据需要切换它们。

类似于:

#if NET40
using FooXX = Foo40;
#elif NET35
using FooXX = Foo35;
#else NET20
using FooXX = Foo20;
#endif

这些符号中的任何一个都是免费的吗?我是否需要将这些符号作为项目配置的一部分注入(inject)?这似乎很容易做到,因为我会知道 MSBuild 的目标是哪个框架。

/p:DefineConstants="NET40"

人们如何处理这种情况?您要创建不同的配置吗?您是否通过命令行传递常量?

最佳答案

实现此目的的最佳方法之一是在您的项目中创建不同的构建配置:

<PropertyGroup Condition="  '$(Framework)' == 'NET20' ">
<DefineConstants>NET20</DefineConstants>
<OutputPath>bin\$(Configuration)\$(Framework)</OutputPath>
</PropertyGroup>


<PropertyGroup Condition=" '$(Framework)' == 'NET35' ">
<DefineConstants>NET35</DefineConstants>
<OutputPath>bin\$(Configuration)\$(Framework)</OutputPath>
</PropertyGroup>

在您的默认配置之一中:

<Framework Condition=" '$(Framework)' == '' ">NET35</Framework>

如果没有在其他任何地方定义,它将设置默认值。在上述情况下,每次构建每个版本时,OutputPath 都会为您提供一个单独的程序集。

然后创建一个 AfterBuild 目标来编译您的不同版本:

<Target Name="AfterBuild">
<MSBuild Condition=" '$(Framework)' != 'NET20'"
Projects="$(MSBuildProjectFile)"
Properties="Framework=NET20"
RunEachTargetSeparately="true" />
</Target>

此示例将在第一次构建后将 Framework 变量设置为 NET20 重新编译整个项目(编译两者并假设第一次构建是上面的默认 NET35)。每次编译都会正确设置条件定义值。

通过这种方式,您甚至可以排除项目文件中的某些文件,如果您不需要 #ifdef 文件的话:

<Compile Include="SomeNet20SpecificClass.cs" Condition=" '$(Framework)' == 'NET20' " />

甚至引用

<Reference Include="Some.Assembly" Condition="" '$(Framework)' == 'NET20' " >
<HintPath>..\Lib\$(Framework)\Some.Assembly.dll</HintPath>
</Reference>

关于c# - 条件编译和框架目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2923181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com