我正在尝试通过代码安装MSI,我遇到了这个解决方案 Programatically installing MSI packages
代码:
public static void Install()
{
try
{
Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer");
Installer installer = (Installer)Activator.CreateInstance(type);
installer.InstallProduct("D:\\Applications\\TortoiseSVN-1.9.3.27038-x64-svn-1.9.3", "ACTION=INSTALL");
}
catch(Exception e)
{
Utilities.showErrorMessageBox(e.Message);
}
}
我得到的例外有这条非描述性消息:{“InstallProduct,PackagePath,PropertyValues”}
我不知道要有什么意义。我也尝试了各种PropertyValues组合,但无济于事。
有人可以解释这个错误背后的原因吗?
修改
使用以下作品:
System.Diagnostics.Process.Start("D:\\Applications\\TortoiseSVN-1.9.3.27038-x64-svn-1.9.3.msi");
那么,这个方法和使用安装程序一样好吗?
答案 0 :(得分:0)
IMO最简单的方法是调用直接API MsiInstallProduct并检查结果以查看发生了什么。 P / Invoke签名很简单,这就是你提到的帖子的结尾。
Programatically installing MSI packages
我看到的许多其他尝试的问题是引入了不必要的COM层。所以你可以在COM层中失败,除非环境是正确的(线程,公寓和其他可能需要的东西),并且失败会混淆MsiInstallProduct将返回的简单错误(如你的情况)。
关闭异常检查(可能是一个内部异常)可能会显示来自MsiInstallProduct的HRESULT或整数结果,可能是此列表中的4位数字:
https://msdn.microsoft.com/en-us/library/aa368542(v=vs.85).aspx
否则,请将Windows Installer日志记录策略设置为创建详细日志:
https://support.microsoft.com/en-us/kb/223300
在记录字符串中使用voicewarmupx,然后在%TEMP%中查找MSIxx.log文件。这假设您的环境不会导致问题。如果您从本地系统帐户运行代码,则如果MSI尝试访问本地系统帐户的桌面等项目,则可能会出现故障。您需要该日志才能看到正在发生的事情。如果MSI文件没有UI并且需要提升,那么它将不会要求提升并且将失败。如果它有一个外部CAB文件,它可能找不到它,然后失败。如果它从映射的驱动器位置运行,那么它也会失败。所以这不仅仅是代码,因为环境很重要。有许多与编码无关的故障点。