如何生成同版本、不同品牌图标的C# WPF Windows应用EXE
实现同版本号的WPF多品牌EXE方案
针对你需要生成功能一致、仅图标不同且版本号统一的两个品牌WPF EXE的需求,以下是几种可行的实现方式:
方案1:单次构建后用PowerShell脚本替换图标
先完成一次正常构建,得到一个基础版本的EXE(版本号为自动生成的统一值),再通过PowerShell脚本复制并替换图标:
- 复制基础EXE为两个目标文件名
- 调用图标修改工具替换各自的图标
示例PowerShell脚本:
# 复制基础构建产物 $baseExePath = ".\bin\Release\MyApp.exe" $brandAExe = ".\bin\Release\MyApp - Brand A.exe" $brandBExe = ".\bin\Release\MyApp - Brand B.exe" Copy-Item -Path $baseExePath -Destination $brandAExe Copy-Item -Path $baseExePath -Destination $brandBExe # 用ResourceHacker替换图标(需确保工具可被调用) & "ResourceHacker.exe" -open $brandAExe -save $brandAExe -action addoverwrite -res ".\Icons\BrandA_Square.ico" -mask ICONGROUP,MAINICON,0 & "ResourceHacker.exe" -open $brandBExe -save $brandBExe -action addoverwrite -res ".\Icons\BrandB_Circle.ico" -mask ICONGROUP,MAINICON,0
如果不想依赖第三方工具,也可以用.NET的图标处理库(如IconLib)编写纯PowerShell代码来修改EXE资源。
方案2:通过MSBuild自定义目标,单次构建生成双版本
直接修改项目的.csproj文件,添加AfterBuild目标,让Visual Studio在构建完成主EXE后自动生成两个品牌版本,全程仅触发一次构建,版本号天然一致:
在项目文件的</Project>标签前添加以下配置:
<Target Name="AfterBuild"> <!-- 生成品牌A版本 --> <Copy SourceFiles="$(OutputPath)$(AssemblyName).exe" DestinationFiles="$(OutputPath)MyApp - Brand A.exe" /> <Exec Command="ResourceHacker.exe -open "$(OutputPath)MyApp - Brand A.exe" -save "$(OutputPath)MyApp - Brand A.exe" -action addoverwrite -res "$(ProjectDir)Icons\BrandA_Square.ico" -mask ICONGROUP,MAINICON,0" /> <!-- 生成品牌B版本 --> <Copy SourceFiles="$(OutputPath)$(AssemblyName).exe" DestinationFiles="$(OutputPath)MyApp - Brand B.exe" /> <Exec Command="ResourceHacker.exe -open "$(OutputPath)MyApp - Brand B.exe" -save "$(OutputPath)MyApp - Brand B.exe" -action addoverwrite -res "$(ProjectDir)Icons\BrandB_Circle.ico" -mask ICONGROUP,MAINICON,0" /> </Target>
将图标文件放在项目的Icons目录下,构建时Visual Studio会自动完成复制和图标替换操作,一次构建得到两个符合要求的EXE。
备选方案:统一版本号管理(若需多配置备份)
如果偶尔需要用到多构建配置,可将版本号定义在Directory.Build.props文件中,让所有配置共享同一版本号:
<Project> <PropertyGroup> <Version>1.0.$([System.DateTime]::Now.ToString("yyyyMMddHHmm"))</Version> <AssemblyVersion>$(Version)</AssemblyVersion> <FileVersion>$(Version)</FileVersion> </PropertyGroup> </Project>
把这个文件放在项目根目录,所有构建配置都会使用这里定义的版本号,避免版本不一致问题。
内容的提问来源于stack exchange,提问作者Jim Walton
相关产品推荐
相关产品推荐

