8

我正在尝试使用教程从 MSI 获取版本而不安装它的代码,但是当我尝试将“msi.dll”添加到 Visual Studio 2010 作为参考时,我收到了这个错误。

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

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

4

4 回答 4

20

使用来自 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 提供有关属性表的文档。MSDN 中还提供了有关 Windows Installer 的 SQL 语法的详细信息

于 2012-04-19T18:25:41.727 回答
3

在此处输入图像描述

在 32 位机器上注册汇编

REGSVR32 MSI.DLL

在 64 位机器上注册汇编

cd \windows\syswow64 regsvr32 C:\WINDOWS\system32\msi.dll 
于 2012-04-19T17:34:48.020 回答
1

来自代码项目:

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

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

于 2012-04-19T17:31:04.413 回答
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"];                
}

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

于 2013-12-25T16:22:54.770 回答