C#使用转换MST调用和调用MSI,以及使用Windows Installer的其他开关

时间:2014-03-04 11:29:32

标签: c# windows-installer transform

我正在尝试使用转换MST调用MSI,并使用Windows Installer安装其他交换机。最终我希望Windows安装程序能够跟踪安装并在进度条上准确显示其进度。

我找到了一些代码片段,可以使用Windows安装程序安装MSI,但是我没有很多运气来运行它。

但是,如果我能得到一些帮助,弄清楚我需要做什么将不胜感激。另外我需要在哪里放置额外的开关(例如写入日志,allusers = 1等)?

我使用的以下代码如下:

private static string appPath = Environment.CurrentDirectory;
private static String msiPath = Path.Combine(appPath, "setup.msi");
private static String mstPath = Path.Combine(appPath, "setup.mst");

Type classType = Type.GetTypeFromProgID("WindowsInstaller.Installer");
Object installerObj = Activator.CreateInstance(classType);
Installer installer = installerObj as Installer;

Database database = Installer.OpenDatabase(msiPath, MsiOpenDatabaseMode.
    msiOpenDatabaseModeTransact);

            database.ApplyTransform(mstPath,
            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);

2 个答案:

答案 0 :(得分:0)

我可能会误解你想要做的事情,但是:

  1. 您可以通过使用指定转换的命令行调用MsiInstallProduct()来安装MSI文件+转换。您无需将ALLUSERS放在任何地方。如果在MSI文件中需要它,则将其放在MSI文件中,否则只需将ALLUSERS = 1添加到命令行。同样,指定登录命令行的路径及其名称。

  2. 如果您最终想要监控安装,我不确定您的期望是什么,但是有一个标准的API定义了回调来执行此操作。这种事情:

  3. http://msdn.microsoft.com/en-us/library/windows/desktop/bb309215(v=vs.85).aspx

    在CodeProject之类的某个地方你可能会找到一个p / invoke库来从C#调用MSI函数,包括回调。除此之外,大多数MSI文件已经附带了UI,所以我真的不知道你的最终目标是什么。

答案 1 :(得分:0)

为什么不使用Process类来调用msiexec / I foo.msi TRANSFORMS = foo.mst / qn?

此外,如果您想从托管代码中与MSI互操作,则黄金标准是在WiX的部署工具基础(DTF)中找到的Microsoft.Deployment.WindowsInstaller程序集。它与尝试COM互操作相比,更加相似和优雅。它使用P / Invoke封装了MSI Win32 API。