您能否告诉 Visual Studio 根据是否设置了特定的条件编译符号来输出不同名称的 exe 文件?
4 回答
如果将 .csproj 文件加载到文本编辑器中,则可以控制该AssemblyName
属性:
<AssemblyName Condition="'$(Configuration)' == 'Debug'">WindowsFormsApplication9.Debug</AssemblyName>
<AssemblyName Condition="'$(Configuration)' != 'Debug'">WindowsFormsApplication9</AssemblyName>
请注意,这不仅会更改文件名,还会更改程序集名称,如果您有其他代码引用程序集,这可能意味着麻烦。
我自己从来没有这样做过,所以我真的不能说这个想法是好是坏。
由于按照 Fredrik 的建议为 assemblyname 标记定义条件似乎会使 Visual Studio 变得古怪,因此您可以稍后在 csproj 文件中更改程序集名称。使用选择元素有点像 if 语句,因此如果满足条件,可以附加名称,如下所示。
DefineConstants
使用“plain vanilla MSBuild”似乎不可能(根据MSDN )从条件属性中获取子字符串,但可以定义自己的构建目标并在使用/p:Tag=value
(MSBuild 命令行参考)编译时设置属性
...
<Tag>true</Tag>
</PropertyGroup>
<Choose>
<When Condition=" '$(Tag)' == 'true' ">
<PropertyGroup>
<AssemblyName>$(AssemblyName).TagDefined</AssemblyName>
</PropertyGroup>
</When>
</Choose>
<ItemGroup>
...
您可以编辑 csproj 文件,它只是一个包含“任务”的 MSBuild 文件。csproj 文件中有一个名为“AfterBuild”的部分。
也许,您可以在那里添加一个命令,将您的 exe 文件重命名为您选择的文件名。
(当然,您必须取消注释该部分)。
也许是这样的:
<Target Name="AfterBuild">
<Copy SourceFiles="" DestinationFiles="" Condition="" />
<Delete Files="" Condition="" />
</Target>
我还没有进一步解决,但是您应该完成 Condition 属性,以便您可以检查条件符号是否已定义。
这里没有一个答案对我有用。
他们要么产生错误,要么什么都不做。
这是我在 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。这可以通过将“move”命令替换为“copy”命令来解决,但在这种情况下,您必须将 Exe 复制到另一个目录,因为您肯定不希望在同一目录中有两次相同的文件。
这一切都是一团糟。您可以直接在项目设置中进入输出目录,这真是令人难以置信,但是要执行一些非常基本的操作,例如更改 Exe 名称,您必须编写一个具有丑陋副作用的笨拙脚本。微软的耻辱!