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

Posted

技术标签:

【中文标题】根据条件编译符号更改exe的名称【英文标题】:Change name of exe depending on conditional compilation symbol 【发布时间】:2011-02-20 18:55:16 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

请注意,这不仅会更改文件名,还会更改程序集名称,如果您有其他代码引用该程序集,这可能会带来麻烦。

我自己从来没有这样做过,所以我真的不能说这个想法是好是坏。

【讨论】:

如何输入我自己的符号的条件,例如NO_LOG 或其他什么而不是配置选择? @Patrick:我的 msbuild 技能并没有延伸那么远。这些常量进入DefineConstants 属性,但它们都进入相同的属性值(CONST1=value;CONST2;CONST3),不幸的是似乎没有任何“包含”操作符可以在Condition 属性中使用。 查看这个帖子:social.msdn.microsoft.com/Forums/en-US/msbuild/thread/… 因为如果您向 assemblyname 添加条件,Visual Studio 似乎会崩溃,这不起作用。但是,您可以将 Assemblyname 标记移动到具有定义条件的属性组...【参考方案2】:

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

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

  ...
  <Tag>true</Tag>
</PropertyGroup>
<Choose>
  <When Condition=" '$(Tag)' == 'true' ">
    <PropertyGroup>
      <AssemblyName>$(AssemblyName).TagDefined</AssemblyName>
    </PropertyGroup>
  </When>
</Choose>
<ItemGroup>
...

【讨论】:

【参考方案3】:

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

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

大概是这样的:

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

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

【讨论】:

没试过,但不幸的是,这会覆盖现有的编译。 也许我可以输入一个 BeforeBuild 并复制现有的应用程序(如果存在)。如果我在 csproj 文件的 DefineConstants 标记中输入了自定义条件符号,我将如何输入条件?【参考方案4】:

这里的答案都不适合我。

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

这是我在 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。这可以通过用“复制”命令替换“移动”命令来解决,但在这种情况下,您必须将 Exe 复制到另一个目录,因为您肯定不希望在同一目录中有两次相同的文件。

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

【讨论】:

以上是关于根据条件编译符号更改exe的名称的主要内容,如果未能解决你的问题,请参考以下文章

iOS swift 条件编译语句

预编译命令行由啥符号开头?

如何将条件编译符号(DefineConstants)传递给 msbuild

如何在 xml 格式的 resx 文件中添加条件编译?

构建整个解决方案,但仅为一个项目添加全局条件编译符号

条件编译