Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C使用转换MST调用和调用MSI,并使用Windows Installer使用其他开关_C#_Windows Installer_Transform - Fatal编程技术网

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

C# C使用转换MST调用和调用MSI,并使用Windows Installer使用其他开关,c#,windows-installer,transform,C#,Windows Installer,Transform,我正在尝试调用MSI以使用Transform MST进行安装,并使用Windows Installer使用其他交换机进行安装。最终,我希望windows installer能够跟踪安装并在进度条上准确显示其进度 我已经找到了一些代码片段,可以让MSI使用windows installer安装,但是我没有太多的运气让它工作 但如果我能得到一些帮助,弄清楚我需要做什么,我将不胜感激。另外,我应该在哪里放置需要的其他开关,例如写入日志、allusers=1等 我一直使用的以下代码如下: private

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

我已经找到了一些代码片段,可以让MSI使用windows installer安装,但是我没有太多的运气让它工作

但如果我能得到一些帮助,弄清楚我需要做什么,我将不胜感激。另外,我应该在哪里放置需要的其他开关,例如写入日志、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);

我可能误解了您的意图,但是:

您可以通过使用指定转换的命令行调用MSI InstallProduct来安装MSI文件+转换。你不需要把诱惑者放在任何地方。如果您需要它在MSI文件中,那么将它放在MSI文件中,否则只需将ALLUSERS=1添加到命令行。同样,指定要在命令行上登录的路径及其名称

如果您最终想要监控安装,我不确定您的期望是什么,但是有一个标准API,它定义了回调来实现这一点。这种事情,


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

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

此外,如果您想从托管代码与MSI进行互操作,则金标准是WiX部署工具基金会DTF中发现的MySuff.AdvestMyTr.WoWoSnStalAlver程序集。它与尝试进行COM互操作非常相似和优雅。它使用P/Invoke封装MSI Win32 API