【问题标题】:Read Product Number from Windows Setup Project从 Windows 安装项目中读取产品编号
【发布时间】:2016-04-18 12:41:40
【问题描述】:

我需要获取我使用 InstalledShield 创建 .exe 的安装项目的产品编号。

我在 Installer API 中阅读了有关 MsiGetProductInfo() 的信息,但在示例代码 c# 中找不到任何用于应用此功能的信息。

谢谢。

【问题讨论】:

    标签: c# .net windows-installer installshield setup-project


    【解决方案1】:

    您指的是 MsiGetProductInfo,因此我假设您有一个 Windows Installer MSI 文件,您的 exe 会安装它(因为它引导先决条件),并且您希望在安装设置后获取信息。

    这是 p/invoke 签名:

    DllImport("msi.dll", CharSet=CharSet.Unicode)]
    static extern Int32 MsiGetProductInfo(string product, 
      string property, [Out] StringBuilder valueBuf, ref Int32 len)
    

    基本上 Product 是 MSI 的 ProductCode guid,它是一个用 {} 括号括起来的字符串。

    您尚未发布任何您可能尝试过的代码,因此无法诊断您可能遇到的任何问题。如果“产品编号”是指版本,则可以使用此处记录的任何值:

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa370130(v=vs.85).aspx

    其中 INSTALLPROPERTY_VERSIONSTRING 之类的内容是在 Windows SDK 的 msi.h 中定义的,其值为“VersionString”。

    在这个例子中也应该有足够多的信息:

    MSI Interop using MSIEnumRelatedProducts and MSIGetProductInfo

    UpgradeCode 通常对于许多不同的 ProductCode 在升级时保持不变,因此如果您在 UpgradeCode 上使用 MsiEnumRelatedProducts 返回 ProductCode,然后将该 ProductCode 插入 MsiGetProductInfo,则代码不会有太大变化。

    【讨论】:

    • 我按照下面的参考做了。stackoverflow.com/questions/4013425/…。但它不返回 ProductVersion。它只返回产品名称和产品代码。知道吗?
    • 我将“ProductVersion”更改为“VersionString”。然后它返回产品版本。谢谢。
    【解决方案2】:

    MsiGetProductInfo 无法工作,因为安装程序是使用 Wix Bootstrapper 构建的。你可以做的,这有点像黑客,是使用任何存档器(它最终是一个存档)打开可执行文件并解析名为0的文件,它是一个XML。您可以在那里找到所有信息,例如版本、产品名称、产品密钥等。

    【讨论】:

    • 我需要在后面执行此代码。我可以按照您的方法执行此操作吗?谢谢。
    • 是的,有归档器 API,只需选择一个对您来说更容易的 API
    猜你喜欢
    • 1970-01-01
    • 2015-05-11
    • 2015-06-25
    • 2012-07-30
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多