我正在尝试使用转换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);
答案 0 :(得分:0)
我可能会误解你想要做的事情,但是:
您可以通过使用指定转换的命令行调用MsiInstallProduct()来安装MSI文件+转换。您无需将ALLUSERS放在任何地方。如果在MSI文件中需要它,则将其放在MSI文件中,否则只需将ALLUSERS = 1添加到命令行。同样,指定登录命令行的路径及其名称。
如果您最终想要监控安装,我不确定您的期望是什么,但是有一个标准的API定义了回调来执行此操作。这种事情:
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。