2

我在 c# 中调用get_PrimaryKeys()函数时遇到问题。msi.dll我想资助给定 MSI 表中的主键。我使用以下代码:

Type installerType = Type.GetTypeFromProgID("WindowsInstaller.Installer");
installer = (Installer)Activator.CreateInstance(installerType);
database = installer.OpenDatabase(MSIPath, MsiOpenDatabaseMode.msiOpenDatabaseModeTransact);
WindowsInstaller.Record data = null;     
data = database.PrimaryKeys[tableName];
string s = data.get_StringData(1);

如果我使用database.get_PrimaryKeys(tableName),它会给出相同的错误,即:

COMexception
Member not found. (Exception from HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))

当我使用 msi.dll 中的其他函数时,它们工作正常。

问题是什么?

4

1 回答 1

1

有一种更简单的方法可以从 C# 代码中查询 MSI 数据库。WiX 工具集包括一个精心设计的便捷 .NET API,称为 DTF(部署工具基础),它可以编写以下代码(C#):

  using (var database = new Database("path\\to\\package.msi", DatabaseOpenMode.ReadOnly))
  {
    var table = database.Tables["someTableName"];
    foreach (var column in table.PrimaryKeys)
    {
      Console.WriteLine("The table {0} defines {1} as primary key", table.Name, column);
    }
  }

所有你需要做的:

  • 安装WiX 工具集
  • Microsoft.Deployment.WindowsInstaller.dll在您的 C# 项目中引用
  • 添加using Microsoft.Deployment.WindowsInstaller;命名空间

您不必为了从 DTF 中获得优势而使用 WiX 构建您的 MSI。参考 DTF.chm(与 WiX 一起安装)以了解更多信息。

于 2012-10-05T06:08:41.083 回答