我在使用条件编译的标准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();
}
有什么想法吗?是否有可能在编译时没有正确设置条件符号?
答案 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(没有如上所示定义的符号)中构建
长话短说,经验教训。始终始终检查项目中的符号定义。