条件编译在C#中表现不正常

时间:2013-08-21 18:17:14

标签: c# visual-studio-2010 conditional-compilation

我在使用条件编译的标准WinForms应用程序中遇到了麻烦

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

在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,我注意到我的源代码是这样的

static void Main()
{
    DoAnotherThing();
    ContinueDoingStuff();
}

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

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

static void Main()
{
    DoSomethingElse();
    ContinueDoingStuff();
}

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

1 个答案:

答案 0 :(得分: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设置。对于两者 .csproj来说都是如此。但是,默认情况下,第一个csproj在Release | x86模式下构建,第二个csproj在Release | AnyCPU(没有如上所示定义的符号)中构建

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

  1. 右键单击.csproj文件,单击属性
  2. 构建标签中,选择所有配置,然后选择所有平台(&lt; - 这就是我忘记的内容)
  3. 现在定义条件编译符号,它将为所有配置设置