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

时间:2010-05-18 08:30:33

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

是否可以告诉Visual Studio输出不同的exe文件名,具体取决于是否设置了特定的条件编译符号?

4 个答案:

答案 0 :(得分:11)

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

<AssemblyName Condition="'$(Configuration)' == 'Debug'">WindowsFormsApplication9.Debug</AssemblyName>
<AssemblyName Condition="'$(Configuration)' != 'Debug'">WindowsFormsApplication9</AssemblyName>

请注意,这不仅会更改文件名,还会更改程序集名称,如果您有其他引用程序集的代码,则可能会出现问题。

我自己从未这样做过,所以我不能说这个想法有多好或多坏。

答案 1 :(得分:5)

由于Fredrik建议的对assemblyname标记的条件定义似乎使Visual Studio变得怪异,您可以稍后在csproj文件中更改程序集名称。使用Choose element有点像if语句,因此如果符合条件,则可以附加名称,如下所示。

在条件属性中获取例如DefineConstants的子字符串似乎不可能(根据MSDN)与“普通的vanilla MSBuild”,但是可以定义自己的构建目标并设置使用/p:Tag=valueMSBuild command line reference

进行编译时的属性
  ...
  <Tag>true</Tag>
</PropertyGroup>
<Choose>
  <When Condition=" '$(Tag)' == 'true' ">
    <PropertyGroup>
      <AssemblyName>$(AssemblyName).TagDefined</AssemblyName>
    </PropertyGroup>
  </When>
</Choose>
<ItemGroup>
...

答案 2 :(得分:1)

您可以编辑csproj文件,该文件只是一个包含“任务”的MSBuild文件。 csproj文件中有一个名为'AfterBuild'的部分。

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

也许是这样的:

<Target Name="AfterBuild">
     <Copy SourceFiles="" DestinationFiles="" Condition="" />
     <Delete Files="" Condition="" />
</Target>

我还没有进一步研究,但你应该完成Condition属性,这样就可以检查是否定义了条件符号。

答案 3 :(得分:1)

这里的答案都不适合我。

他们要么产生错误要么什么都不做。

这是我在VS2005中运行的解决方案,我想它也适用于较新的VS版本。像这样编辑文件* .csproj:

<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>

结果将是32位编译产生文件ProjectName_32.exe并且64位构建产生ProjectName_64.exe

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

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

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