我可以从C++或C#程序中提取MSI包的内容吗?比如,如果我有一个MSI安装文件,我可以从C#或C++程序中提取它的内容而不安装它吗?通常,您可以执行管理安装来提取MSI的内容。msiexec/afoo.msiTARGETDIR=C:EXTRACTHERE/qn如果不想退出进程,可以直接通过MsiInstallProduct函数与MSI互操作。szPackagePath[in]一个以null结尾的字符串,指定WindowsInstaller程序包位置的路径。字符串值可以包含URL、网络路径、文件路径(例如file://packageLocation/package.msi)或本地路径(例如D:\packageLocation\package.msi)。szCommandLine[in]指定命令行属性设置的空终止字符串。这应该是格式为Property=SettingProperty=Setting的列表。有关详细信息,请参阅关于属性。要执行管理安装,请在szCommandLine中包含ACTION=ADMIN。有关详细信息,请参阅ACTION属性。请注意,虽然您可以自己声明P/Invoke,但WindowsInstallerXML提供了一个非常好的.NET互操作库,称为DeploymentToolsFoundation(DTF)。Microsoft.Deployment.WindowsInstaller命名空间有一个名为Installer的类方法,它公开了一个名为InstallProduct的静态方法。这是MsiInstallProduct的直接包装。使用DTF库隐藏了Win32API上的丑陋之处,并正确实现了IDisposable以确保在需要时释放底层非托管句柄。此外,DTF有一个带有InstallPackage类的Microsoft.DeploymentWindowsInstaller.Package命名空间。此类公开了一个名为ExtractFiles()的方法,该方法将文件提取到工作目录。代码示例如下:usingMicrosoft.Deployment.WindowsInstaller;使用Microsoft.Deployment.WindowsInstaller.Package;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){using(varpackage=newInstallPackage(@"C:test.msi",DatabaseOpenMode.ReadOnly)){package.ExtractFiles();}}}}MSI文件是COM结构化存储。它基本上是一个数据库。在msdn上可以找到一些详细的文档:以上是C#学习教程:CanIextractthecontentsoftheMSIpackagefromaC++orC#program?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
