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