条件编译在 C# 中的行为不正确

Posted

技术标签:

【中文标题】条件编译在 C# 中的行为不正确【英文标题】:Conditional Compilation not behaving correctly in C# 【发布时间】:2013-08-24 06:18:22 【问题描述】:

我在使用条件编译的标准 WinForms 应用程序中遇到问题

我有 2 个引用同一个 Program.cs 文件的 .csproj(它们也位于磁盘上的同一个文件夹中)

在 Project1.csproj 中,我定义了一个名为 CONDITION_1 的条件编译符号

在 Project2.csproj 中,我定义了一个名为 CONDITION_2 的条件编译符号

static void Main()

  #if CONDITION_1
    DoSomething();
  #elif CONDITION_2
    DoSomethingElse();
  #else
    DoAnotherThing();
  #endif
    ContinueDoingStuff();

这些符号定义为“所有配置”的项目设置。 在我的调试环境中,一切正常。但是,当我重新检查源代码并在我的构建机器上构建时,我在反编译器中打开 Project2.exe,我注意到我的源代码是这样的 p>

static void Main()

    DoAnotherThing();
    ContinueDoingStuff();

如果我在 Visual Studio 中打开解决方案文件并执行常规构建(不清理、不重建、不更改代码)

我打开 exe 并注意到 Project2.exe 的正确反编译源...

static void Main()

    DoSomethingElse();
    ContinueDoingStuff();

有什么想法吗?是否有可能在编译时没有正确设置条件符号?

【问题讨论】:

您可能忘记为发布配置设置这些条件。 条件设置为“所有配置”。这包括“发布”。但是我仔细检查了 .csproj 并定义了符号。此外,如果没有设置它们,那仍然无法解释简单构建(在发布模式下)创建正确编译的 exe 的行为。 你能用一个简单的项目重现这种行为并上传到某个地方让我们看看吗? 当我手动检查 .csproj 时,我注意到符号不是为 Release|AnyCPU 定义的,而是为 Release|x86 定义的。所以我猜当你为“所有配置”设置符号时,它也不意味着“所有平台”。很高兴我找到了! 【参考方案1】:

好的,好的。我想到了。我觉得有点傻,但同时也很容易错过。

这是我的 .csproj 的摘录

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<ResGenToolArchitecture>Managed32Bit</ResGenToolArchitecture>
<OutputPath>..\BinPC\Release\</OutputPath>
<DefineConstants>CONDITION_2</DefineConstants>
<Optimize>false</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>

这里是 Release|AnyCPU

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<ResGenToolArchitecture>Managed32Bit</ResGenToolArchitecture>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\BinPC\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>

在 Visual Studio 中,我为 x86 目标平台设置了 CONDITION_2,但没有设置 AnyCPU。 both .csproj 都是如此。但是,第一个 csproj 默认是在 Release|x86 模式下构建的,第二个是在 Release|AnyCPU 中构建的(没有如上所示定义的符号)

长话短说,吸取教训。始终检查项目中的符号定义。

    右键单击 .csproj 文件,单击属性。 在 build 标签中,选择 All ConfigurationsAll Platforms( 现在定义条件编译符号,它将为所有配置设置

【讨论】:

以上是关于条件编译在 C# 中的行为不正确的主要内容,如果未能解决你的问题,请参考以下文章

C#-#define条件编译

使用批处理文件对 c# 解决方案进行条件编译 [关闭]

XAML 条件编译

C#-C#-#define条件编译

尝试在 C# 中简化条件编译的步骤

C# 条件编译 (#if 和 Conditional)