检索存储在 msi 中的应用程序的程序集版本

问题描述 投票:0回答:3

我无法弄清楚如何从安装程序 msi 中得知它将安装的应用程序的 AssemblyVersion 是什么。

我想每隔几个小时向网络位置发出一个请求,检查 setup.msi 以检测更改,然后提示用户更新。

我可以绑定两个 AssemblyVersions,以便当我增加应用程序时,它也会增加安装程序吗?这样我就可以检查安装程序版本了?

或者,有没有办法从 msi 得知它将安装什么应用程序版本?

或者我应该以不同的方式解决这个问题,比如将带有修订号的文本文件放在网络共享上? (不推荐)

注意我已使用

SetupProject
创建我的安装程序。

c# winforms windows-installer
3个回答
1
投票

冒着重复 Michael U 的一些回答的风险,我要指出,没有人在 Windows Installer 环境中这样做。当 Visual Studio MSI 构建中的任何文件需要部署到客户端时,VS 安装项目的唯一解决方案是主要升级,您可以增加安装项目的版本(接受更改),将RemovePreviousVersions 设置为 true,然后您可以必须增加需要更新的文件的文件版本。您不需要更改 AssemblyVersion 来执行此操作,但需要增加 AssemblyFileversion。这应该有帮助:

https://www.red-gate.com/simple-talk/dotnet/visual-studio/updates-to-setup-projects/

但是缺少有关更新文件版本的部分。

总的来说,更新机制相当简单。主要升级基于UpgradeCode,因此您的应用程序只需在某处进行Web服务调用,传递当前ProductVersion和UpgradeCode,然后您需要下载高于当前ProductVersion的任何版本,然后安装它。这是适用于客户端系统上的多个产品的总体思路,如果您知道只有一种产品,则有更简单的解决方案。


1
投票

(我在这里泛泛地谈论Windows Installer,因为我对SetupProject不是很熟悉。)

如果您的构建系统支持它,并且您将程序集版本限制为可表示为 ProductVersion 的版本,那么您当然可以将 msi 和程序集包含的版本控制信息联系起来。请注意,如果您想使用 Windows Installer 升级逻辑,则必须对前三个字段进行有意义的更改,因为 Windows Installer 会忽略第四个字段。

如果您可以破解 .msi 文件来执行您自己的逻辑(例如使用 Windows Installer API 或 DTF 等包装器),您应该能够从存储在 msi 数据库中的元数据中读取程序集版本。特别是,您需要从 MsiAssemblyName 表File 表 读取值。请注意,MsiAssemblyName 表包含程序集版本,File 表包含文件版本;仅当您确保这些值时才会同步。


1
投票

虽然这是一个较旧的问题,但我尝试在 VB .net 中解决这个问题并提出了以下解决方案。这有帮助吗?

顺便说一句。此代码检查 MSI 文件的版本号,该版本号可以在 SetupProject 文件中设置(请参阅属性),但我认为。此版本应与安装项目中包含的项目/解决方案相同。

    Private Function checkVersionAssemblyInMsiFile(filename As String) As String
Try
    Dim WindowsInstaller = CreateObject("WindowsInstaller.Installer")

    Dim Database = WindowsInstaller.GetType().InvokeMember("OpenDatabase", Reflection.BindingFlags.InvokeMethod, Nothing, WindowsInstaller, {filename, 0})
    Dim Query = "SELECT Value FROM Property WHERE Property = 'ProductVersion'"
    Dim View = Database.GetType().InvokeMember("OpenView", Reflection.BindingFlags.InvokeMethod, Nothing, Database, {Query})
    View.GetType().InvokeMember("Execute", Reflection.BindingFlags.InvokeMethod, Nothing, View, Nothing)
    Dim Record = View.GetType().InvokeMember("Fetch", Reflection.BindingFlags.InvokeMethod, Nothing, View, Nothing)
    Dim Version = Record.GetType().InvokeMember("StringData", Reflection.BindingFlags.GetProperty, Nothing, Record, {1})

    Return Version

Catch ex As Exception
    Return Nothing
End Try

结束功能

© www.soinside.com 2019 - 2024. All rights reserved.