2

我在使用条件编译的标准 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,我注意到我的源代码是这样的

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

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

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

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

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

4

1 回答 1

3

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

这是我的 .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 模式下构建,第二个在 Release|AnyCPU 中构建(没有如上所示定义的符号)

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

  1. 右键单击 .csproj 文件,单击属性
  2. 构建选项卡中,选择所有配置所有平台(<-- 这是我忘记的)
  3. 现在定义条件编译符号,它将为所有配置设置
于 2013-08-22T15:39:17.747 回答