我无法使用ConfigureProduct安静地运行卸载。我有以下内容:
using Microsoft.Deployment.WindowsInstaller;
Installer.ConfigureProduct(productCode, 0, InstallState.Absent, "/q");
根据一些早期的帖子“/ q”应该工作,除了我每次运行代码时都得到以下异常。
"Invalid command line argument. Consult the Windows Installer SDK for detailed command line help."
请注意,使用msiexec.exe时“/ q”可以正常工作,但我想使用Microsoft.Deployment.WindowsInstaller执行此操作。
我还尝试使用以下方法将UI设置为静默:
Installer.SetInternalUI(InstallUIOptions.Silent);
Installer.ConfigureProduct(productCode, 0, InstallState.Absent, "");
但后来我得到以下异常:
"Fatal error during installation."
从我收集的消息中,SetInternalUI用于安装而不是卸载但不确定。
我使用的是WiX 3.9 R2安装的DLL,版本为2.0.50727。
任何帮助表示赞赏。谢谢!
编辑:我看了一下“ConfigureProduct”方法中“commandLine”参数的注释。
// commandLine:
// Specifies the command line property settings. This should be a list of the
// format Property=Setting Property=Setting.
所以基本上没有,你不能传递“/ q”,“/ l”,或其他不是“Property = Setting”形式的东西。答案中链接的参考文章中的示例似乎是错误的。 (或者版本之间发生了变化,但我对此表示怀疑。)
如果它正常卸载没有任何错误,那么最可能的问题是卸载需要提升并且您的代码没有运行提升,因此它会失败。在静默卸载期间,它不会要求用户提升!
SetInternalUI适用于卸载。例如,以下C ++代码段完全符合您的要求,使卸载完全无声:
INSTALLUILEVEL il = MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
UINT n = MsiConfigureProductEx(productid, INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT, L"REBOOT=R");
并且ConfigureProduct调用使用相同的API。
尝试使用不同方法的此参考来卸载MSI文件(选项6描述DTF):
不幸的是,我目前还没有Visual Studio可供测试 - 我仍然会试一试,但我无法测试任何东西。毋庸置疑,这使得回答变得困难:
尝试在静默卸载期间启用日志记录,如此处所示(适当调整日志文件的路径)。特别的! flag将刷新日志文件 - 这意味着它是连续写入而不是批量写入,因此不会因为任何潜在的崩溃而丢失日志记录(这会大大减慢(un)安装过程):
using Microsoft.Deployment.WindowsInstaller;
public static void Uninstall( string productCode)
{
Installer.SetInternalUI(InstallUIOptions.Silent);
Installer.ConfigureProduct(productCode, 0, InstallState.Absent, "REBOOT=\"R\" /L*V! c:\uninstall.log");
}
要在日志文件中查找相关信息,请查看此log file checking tip from Rob Mensching(Wix的创建者)。
只是为了提供一个更好的答案,链接到一个新的:Uninstalling program。
UAC和GUI:基本上您的静默卸载失败,因为它在没有高程的情况下运行。以交互方式运行时,您将获得UAC提示并可以提升权限 - 前提是您的帐户是管理员帐户并允许您这样做。静默运行时,不会发生此提升,卸载失败。解决方案是运行升级的应用程序可执行文件。
异常处理:您可能还希望使用适当的异常处理来确保向用户报告由于缺少高程而导致的错误消息。有关示例,请参阅上面链接中的代码。这是一个快速内联部分:
try
{
Installer.SetInternalUI(InstallUIOptions.Silent); // Set MSI GUI level
Installer.ConfigureProduct(productcode, 0, InstallState.Absent, "REBOOT=\"ReallySuppress\"");
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.Message);
Console.ReadLine (); // Keep console window open
}