如何获得MSI版本?

时间:2012-04-19 17:23:17

标签: c# .net visual-studio-2010

我正在尝试使用教程 Getting version from MSI without installing it 中的此代码,但是当我尝试将“msi.dll”添加到Visual Studio 2010作为参考时,我收到此错误。

  

无法加载文件或程序集“msi.dll”或其某个依赖项。   该模块应该包含一个程序集清单。

     

此文件可能不是托管程序集

4 个答案:

答案 0 :(得分:14)

使用Wix项目的部署工具基础(DTF)中的“Microsoft.Deployment.WindowsInstaller.dll”。 DTF为msi.dll的大部分提供了托管包装器。 Wix还提供了有用的文档。

在这里使用DTF是我如何在C#中访问msi的版本号

using Microsoft.Deployment.WindowsInstaller;

namespace Msi.Tables
{
    public class PropertyTable
    {
        public static string Get(string msi, string name)
        {
            using (Database db = new Database(msi))
            {
                return db.ExecuteScalar("SELECT `Value` FROM `Property` WHERE `Property` = '{0}'", name) as string;
            }
        }
        public static void Set(string msi, string name, string value)
        {
            using (Database db = new Database(msi, DatabaseOpenMode.Direct))
            {
                db.Execute("UPDATE `Property` SET `Value` = '{0}' WHERE `Property` = '{1}'", value, name);
            }
        }
    }
}

然后从我的申请

string msiVersion = PropertyTable.Get("MyInstall.msi", "ProductVersion");

您可以使用Orca查看msi表。 MSDN提供了Property Table的文档。 SQL syntax for Windows Installer的详细信息也可在MSDN中找到

答案 1 :(得分:3)

enter image description here

在32位机器上注册程序集

REGSVR32 MSI.DLL

在64位机器上注册程序集

cd \windows\syswow64 regsvr32 C:\WINDOWS\system32\msi.dll 

答案 2 :(得分:1)

来自codeproject:

  

要访问版本号或其他与产品相关的内容,我们需要在Visual Studio .NET中使用DLL引用。   DLL名称:msi.dll(存在于system32中)。

我认为您应该在解决方案资源管理器中添加对项目的引用(右键单击SE中的References - > Add Reference - >然后浏览到system32目录中的msi.dll)。

答案 3 :(得分:0)

system.management添加到引用并包含命名空间。

var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Product where Name LIKE '%Your MSI Name%'");

foreach (ManagementObject obj in searcher.Get())
{
  var version = obj["Version"];                
}

这将为您提供控制面板中安装的任何软件的版本。