如何从MSI安装包获取应用AssemblyVersion及实现版本同步检测?
没问题,这两个需求都能实现,我给你详细拆解一下:
一、将应用AssemblyVersion与MSI版本绑定,同步升级
当然可以把应用的AssemblyVersion和MSI安装包的版本绑定在一起,这样升级应用时同步更新MSI版本,后续就能通过检测MSI版本来触发更新提示了。这里有两种实用的实现方式:
构建流程自动同步(推荐)
借助CI/CD脚本(比如PowerShell、MSBuild),你可以在构建MSI前自动读取应用程序集的AssemblyVersion,然后把这个版本号赋值给MSI项目的版本属性(比如WiX的ProductVersion,或者Visual Studio安装项目的Version字段)。举个PowerShell的简单示例:# 读取目标应用程序的AssemblyVersion $appExePath = "bin/Release/YourApp.exe" $assembly = [System.Reflection.Assembly]::LoadFrom($appExePath) $targetVersion = $assembly.GetName().Version.ToString() # 将版本号写入WiX项目的.wxs文件(替换ProductVersion字段) $wxsContent = Get-Content "Installer/Product.wxs" -Raw $updatedContent = $wxsContent -replace 'ProductVersion="[^"]+"', "ProductVersion=`"$targetVersion`"" Set-Content "Installer/Product.wxs" $updatedContent这样每次构建MSI时,都会自动同步应用的版本号,保证两者完全一致,后续只需要检测MSI的
ProductVersion就能判断是否需要更新。手动关联版本(适合小型项目)
如果你的发布流程是手动操作的,也可以每次发布新版本时,手动将应用的AssemblyVersion修改为和MSI的ProductVersion相同。虽然繁琐,但操作直观,适合团队规模小、发布频率低的场景。
二、直接从MSI获取待安装应用的AssemblyVersion
如果不想绑定版本,也可以直接从MSI安装包中提取待安装应用的版本号,这里有两种可靠的方法:
通过Windows Installer API编程读取
你可以用C#调用Windows Installer的COM接口(需要引用WiX Toolset提供的Microsoft.Deployment.WindowsInstaller.dll),直接查询MSI数据库中的File表,获取目标应用程序的版本信息。示例代码如下:using Microsoft.Deployment.WindowsInstaller; public string GetAppAssemblyVersionFromMsi(string msiFilePath) { using (var msiDatabase = new Database(msiFilePath, DatabaseOpenMode.ReadOnly)) { // 替换为你的应用程序文件名,比如YourApp.exe var query = "SELECT Version FROM File WHERE FileName='YourApp.exe'"; using (var view = msiDatabase.OpenView(query)) { view.Execute(); var record = view.Fetch(); return record?.GetString(0); } } }这个方法能精准获取待安装应用的
AssemblyVersion(前提是打包时正确将版本信息写入了MSI的File表)。使用命令行工具手动提取
如果你只是需要手动排查MSI里的版本,可以用WiX Toolset的dark.exe工具将MSI反编译为WiX源码,然后在生成的文件中查找应用程序的版本号:dark.exe "path/to/setup.msi" -x "output_directory"反编译完成后,在输出目录的文件或WiX源码中就能找到目标应用的版本信息,不过这个方法更适合手动操作,不适合程序自动检测。
内容的提问来源于stack exchange,提问作者atoms

