如何使用Wix通过编码设置service version与installer version一致 无需GUI操作
实现步骤(全程代码配置,无需GUI操作)
方案1:自动绑定服务exe版本到安装包版本(推荐,版本来源为服务程序本身)
这种方式不需要手动维护安装包版本,Wix会自动读取你打包的服务exe的文件版本作为安装包版本,确保两者完全一致:
- 在你的
.wxs工程文件头部定义全局变量,绑定服务exe路径:
<!-- 替换为你自己的服务exe编译输出路径 --> <?define ServiceExePath="..\YourServiceProject\bin\Release\YourService.exe"?>
- 把Wix安装包的版本直接绑定服务exe的文件版本:
<Product Id="*" Name="你的安装包名称" Language="1033" Version="!(bind.FileVersion.ServiceExeFile)" Manufacturer="你的厂商名称" UpgradeCode="你的唯一升级GUID" >
- 在组件节点定义服务exe的安装和注册逻辑,注意File元素的Id要和上面绑定的
ServiceExeFile对应:
<Component Id="ServiceComponent" Guid="你的组件唯一GUID"> <File Id="ServiceExeFile" Source="$(var.ServiceExePath)" KeyPath="yes" /> <!-- 服务注册配置 --> <ServiceInstall Id="YourServiceInstall" Type="ownProcess" Name="你的服务内部名称" DisplayName="你的服务显示名称" Description="服务描述(可按需拼接版本:版本!(bind.FileVersion.ServiceExeFile))" Start="auto" Account="LocalSystem" ErrorControl="normal" /> <!-- 服务启停控制 --> <ServiceControl Id="YourServiceControl" Name="你的服务内部名称" Start="install" Stop="both" Remove="uninstall" Wait="yes" /> </Component>
方案2:以安装包版本为主,同步修改服务exe版本
如果你需要统一以安装包定义的版本为准,自动同步修改服务exe的文件版本,可以添加预编译脚本实现:
- 先在Wix工程中定义统一的版本变量:
<?define ProductVersion="1.2.3.4"?>
- 在Wix项目的预生成事件中添加PowerShell脚本,自动修改服务项目的程序集版本信息:
$assemblyPath = "..\YourServiceProject\Properties\AssemblyInfo.cs" $version = "$(var.ProductVersion)" (Get-Content $assemblyPath -Encoding UTF8) ` -replace 'AssemblyVersion\(".*?"\)', "AssemblyVersion(`"$version`")" ` -replace 'AssemblyFileVersion\(".*?"\)', "AssemblyFileVersion(`"$version`")" ` | Set-Content $assemblyPath -Encoding UTF8
- 后续编译时会先自动更新服务项目的版本,再编译服务和安装包,两者版本完全一致。
如果需要在系统服务的注册信息中额外存储版本号,还可以在组件中添加注册表配置:
<RegistryKey Root="HKLM" Key="SYSTEM\CurrentControlSet\Services\你的服务内部名称\Parameters"> <RegistryValue Name="ServiceVersion" Value="$(var.ProductVersion)" Type="string" /> </RegistryKey>
内容的提问来源于stack exchange,提问作者R.P
相关产品推荐
相关产品推荐

