0

我正在尝试在 C# .Net 中开发一个工具(使用 Windows 窗体)。我已经生成了一个 MSI 文件和一个 MST(转换文件)。我必须首先读取 msi 文件(使用表单菜单菜单项从用户获取输入),然后读取 mst 文件(与 msi 作为输入的方式相同)。接下来,通过复制输入的 msi 创建一个临时 msi(可能在临时位置)并将转换应用于该临时 msi。然后,我可以根据我的要求查询 msi 表(与 mst 合并)。我正在使用 Visual Studio 2010 专业版。这是我使用 Windows 安装程序参考库编写的一段代码。

      using System;
      using System.ComponentModel;
      using System.Windows.Forms;
      using WindowsInstaller;
      using System.Xml;
      using System.IO;

        //// Create an Installer instance
        Type classType = Type.GetTypeFromProgID("WindowsInstaller.Installer");
        Object installerObj = Activator.CreateInstance(classType);
        Installer installer = installerObj as Installer;
        Database database = Installer.OpenDatabase(File_MSI,MsiOpenDatabaseMode.
         msiOpenDatabaseModeTransact);
            database.ApplyTransform (File_MST, MsiTransformError.msiTransformErrorViewTransform);
            WindowsInstaller.View viewmst = null;
            string sqlquerymst = string.Format("Select * FROM _TransformView");
            viewmst = database.OpenView(sqlquerymst);
            viewmst.Execute(null);
            database.Commit();
            viewmst.Close();
            string sql = String.Format("Select Property,Value FROM Property");
            WindowsInstaller.View view = database.OpenView(sql);
            view.Execute(null);
4

1 回答 1

1

虽然尚不清楚您面临什么问题,但我有一些一般性建议给您:

  • 即使您没有使用WiX 工具集来构建您的 MSI 程序包,您也可以利用其 .NET API 来处理称为 DTF 的 MSI 程序包。您可以在与 WiX 工具集一起安装的 DTF.chm 文件中找到更多信息。例如,看一下Database类及其ApplyTransform()方法
  • 你描述的场景听起来有点棘手,我怀疑它可以简化。如果您将转换应用于 MSI 包以读取该转换带来的内容,则在构建此转换时在较早的步骤中获取该数据可能会容易得多,并避免查询 MSI 数据库,这不是最简单的事情。当然,这是指你自己制作转换的情况,它不是第三方的东西

希望这可以以任何方式帮助您。

于 2012-07-25T10:52:50.800 回答