当前位置:  开发笔记 > 编程语言 > 正文

如何以编程方式读取MSI文件中的属性?

如何解决《如何以编程方式读取MSI文件中的属性?》经验,为你挑选了3个好方法。

有没有办法读取msi文件中的属性?

例如,给定一个msi文件名Testpackage.msi

我需要找到

productName
PackageCode
version

我将使用它与WMI卸载

string objPath = string.Format("Win32_Product.IdentifyingNumber='{0}',Name='{1}',Version='{2}'", "{AC9C1263-2BA8-4863-BE18-01232375CE42}", "testproduct", "10.0.0.0");

更新:使用Orca是一个很好的选择,如果这可以以编程方式实现,那么我可以使用它来生成自动发行说明.并且在卸载程序中也是如此.



1> csexton..:

您可以使用Microsoft的Orca.exe.Orca将允许您打开MSI并编辑/查看其中的所有表.您必须下载整个Windows SDK才能获得它,但幸运的是,这是免费的.

一种替代方案(由于SDK的下载大小可能更快)是使用来自WiX项目的 dark.exe .Dark是一个MSI反编译器,它将所有内容导出到XML文件和资源集合中.它输出的XML将包含您要查找的信息.



2> Arnout..:

您可以使用基于COM的API来处理MSI,并执行类似的操作

Function GetVersion(ByVal msiName)

    Const msiOpenDatabaseModeReadOnly = 0
    Dim msi, db, view

    Set msi = CreateObject("WindowsInstaller.Installer")
    Set db = msi.OpenDataBase(msiName, msiOpenDatabaseModeReadOnly)
    Set view = db.OpenView("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductVersion'")
    Call view.Execute()

    GetVersion = view.Fetch().StringData(1)

End Function



3> Stein Åsmul..:

我只想提一下现在情况变得更加容易了.Windows Installer对象模型有一个完整的.NET包装器,因此您可以避免任何COM互操作笨拙.

包装器称为" 部署工具基础 "(DTF),这里是基本描述:" 部署工具基础是一组丰富的.NET类库和相关资源,它们将Windows部署平台技术整合到.NET世界中.旨在大大简化与部署相关的开发任务,同时仍然暴露底层技术的完整功能 ".

这是一个精简的动手样本:

using (var db = new Database(FullPath, DatabaseOpenMode.ReadOnly))
{    
  PackageCode = db.SummaryInfo.RevisionNumber;
  AppVendor = db.SummaryInfo.Author;
  AppName = db.SummaryInfo.Title;
  ProductName = db.SummaryInfo.Subject;
  ProductCode = (string)db.ExecuteScalar("SELECT `Value` FROM "+
                 "`Property` WHERE `Property` = 'ProductCode'");
  AppVersion = (string)db.ExecuteScalar("SELECT `Value` FROM "+
                 "`Property` WHERE `Property` = 'ProductVersion'");
  UpgradeCode = (string)db.ExecuteScalar("SELECT `Value` FROM "+
                 " `Property` WHERE `Property` = 'UpgradeCode'");
}

主DTF文件(后两个是最常用的):

Microsoft.Deployment.Compression.dll - 存档打包和解包的框架.

Microsoft.Deployment.Compression.Cab.dll - 实现cabinet归档打包和解包.

Microsoft.Deployment.Resources.dll - 用于读取和写入可执行文件中的资源数据的类.

Microsoft.Deployment.WindowsInstaller.dll - 完整的基于.NET的Windows Installer API类库.

Microsoft.Deployment.WindowsInstaller.Package.dll - 用于使用Windows Installer安装和修补程序包的扩展类.

只需创建一个C#项目,引用这些文件,并使用您想要和需要的任何控制来编写您自己的部署应用程序.我目前没有使用DTF工具,但请参阅此示例以了解C#程序如何工作的一般概念.

DTF包含在WIX中.从这里下载WiX.

DTF dll位于主WiX安装文件夹的SDK文件夹中(默认位置为:%ProgramFiles(x86)%\ WiX Toolset v3.10\SDK).到您看到时,版本号可能会有所不同.只需在%ProgramFiles(x86)%下查找WiX文件夹即可.

在"doc"文件夹中查找DTF帮助文件.DTF.chmDTFAPI.chm.绝对优秀的对象模型及其用法文档.

有关更多DTF详细信息,请参阅此serverfault.com帖子

一些使用WiX的初学者建议:MSI vs nuget包:哪些更适合持续交付?


DTF隐藏在WixInstallPath\SDK目录,Microsoft.Deployment.*.dlls中.
推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有