C# 根据条件编译符号更改exe的名称

C# 根据条件编译符号更改exe的名称,c#,visual-studio,msbuild,conditional-compilation,C#,Visual Studio,Msbuild,Conditional Compilation,能否告知Visual Studio根据是否设置了特定的条件编译符号来输出不同的exe文件名?如果将.csproj文件加载到文本编辑器中,则可以控制AssemblyName属性: <AssemblyName Condition="'$(Configuration)' == 'Debug'">WindowsFormsApplication9.Debug</AssemblyName> <AssemblyName Condition="'$(Configuration)'

能否告知Visual Studio根据是否设置了特定的条件编译符号来输出不同的exe文件名?

如果将.csproj文件加载到文本编辑器中,则可以控制
AssemblyName
属性:

<AssemblyName Condition="'$(Configuration)' == 'Debug'">WindowsFormsApplication9.Debug</AssemblyName>
<AssemblyName Condition="'$(Configuration)' != 'Debug'">WindowsFormsApplication9</AssemblyName>
WindowsFormsApplication9.Debug
Windows窗体应用程序9
但请注意,这不仅会更改文件名,还会更改程序集名称,如果有其他代码引用该程序集,则可能会出现问题


我自己从来没有这样做过,所以我真的说不出这个主意是好是坏。

您可以编辑csproj文件,它只是一个包含“任务”的MSBuild文件。 csproj文件中有一个称为“后构建”的部分

也许,您可以在那里添加一个命令,将exe文件重命名为您选择的文件名。
(当然,您必须取消对该部分的注释)

也许是这样的:

<Target Name="AfterBuild">
     <Copy SourceFiles="" DestinationFiles="" Condition="" />
     <Delete Files="" Condition="" />
</Target>
<PropertyGroup>
  <PreBuildEvent>
  </PreBuildEvent>
  <PostBuildEvent>
    if $(PlatformTarget) == x86  move /y "$(TargetPath)" "$(TargetDir)$(ProjectName)_32.exe"
    if $(PlatformTarget) == x64  move /y "$(TargetPath)" "$(TargetDir)$(ProjectName)_64.exe"
  </PostBuildEvent>
</PropertyGroup>


我还没有进一步解决这个问题,但您应该完成Condition属性,以便检查是否定义了条件符号。

由于按照Fredrik的建议为assemblyname标记定义条件似乎会使Visual Studio变得古怪,因此您可以稍后在csproj文件中更改程序集名称。使用类似于if语句,因此如果满足条件,可以附加名称,如下所示

使用“普通MSBuild”从条件属性中的例如
DefineConstants
中获取子字符串似乎是不可能的(根据),但是可以定义自己的生成目标,并在使用
/p:Tag=value
()编译时设置属性

。。。
真的
$(AssemblyName).TagDefined
...

这里没有一个答案适合我

它们要么产生错误,要么什么也不做

这是我在VS2005中使用的解决方案,我想它也可以在更新的VS版本中使用。按如下方式编辑文件*.csproj:

<Target Name="AfterBuild">
     <Copy SourceFiles="" DestinationFiles="" Condition="" />
     <Delete Files="" Condition="" />
</Target>
<PropertyGroup>
  <PreBuildEvent>
  </PreBuildEvent>
  <PostBuildEvent>
    if $(PlatformTarget) == x86  move /y "$(TargetPath)" "$(TargetDir)$(ProjectName)_32.exe"
    if $(PlatformTarget) == x64  move /y "$(TargetPath)" "$(TargetDir)$(ProjectName)_64.exe"
  </PostBuildEvent>
</PropertyGroup>

如果$(PlatformTarget)==x86移动/y“$(TargetPath)”“$(TargetDir)$(ProjectName)_32.exe”
如果$(PlatformTarget)==x64移动/y“$(TargetPath)”“$(TargetDir)$(ProjectName)_64.exe”
结果是,32位编译生成一个文件
ProjectName\u 32.exe
,64位编译生成
ProjectName\u 64.exe

请注意奇怪的语法。
if
条件周围不能有括号,并且
x86
不能带引号

此方法的缺点是无法在调试器中启动Exe,因为Visual Studio找不到它生成的Exe。这可以通过将“move”命令替换为“copy”命令来解决,但在这种情况下,您必须将Exe复制到另一个目录,因为您肯定不希望在同一目录中有相同的文件两次


这一切都是一团糟。您可以直接在项目设置中输入输出目录,这真是难以置信,但要做一些真正基本的事情,如更改Exe名称,您必须编写这样一个有着丑陋副作用的笨拙脚本。微软真可耻

我如何为自己的符号输入条件,例如
NO_LOG
或其他东西,而不是配置选择?@Patrick:我的msbuild技能并没有发挥那么大的作用。这些常量进入
DefineConstants
属性,但它们都进入相同的属性值(
CONST1=value;CONST2;CONST3
),不幸的是,似乎没有任何“包含”-可在
条件
属性中使用的运算符。请检查此线程:因为如果向assemblyname添加条件,Visual Studio似乎会崩溃,因此此操作不起作用。但是,您可以使用定义的条件将Assemblyname标记移动到propertygroup…没有尝试,但这将很不幸地覆盖现有编译。也许我可以输入BeforeBuild并复制现有应用程序(如果存在)。如果在csproj文件的
DefineConstants
标记中输入了自定义条件符号,我将如何输入条件?