我无法使用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”形式的东西。答案中链接的参考文章中的示例似乎是错误的。 (或者版本之间发生了一些变化,但我对此表示怀疑。)
答案 0 :(得分:1)
尝试使用不同方法的参考来卸载MSI文件(选项6描述DTF):
不幸的是我现在还没有 Visual Studio 进行测试 - 我仍然会试一试,但我无法测试任何东西。毋庸置疑,这使得回答变得困难:
尝试在静默卸载期间启用日志记录,如此处所示(适当调整日志文件的路径)。特殊的!标志将刷新日志文件 - 这意味着它是连续写入而不是批量写入,因此不会因为任何潜在的崩溃而丢失日志记录(这会减慢(联合国)安装过程相当多):
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的创建者)。
答案 1 :(得分:1)
如果它正常卸载而没有任何错误,那么最可能的问题是卸载需要提升并且您的代码没有运行提升,因此它会失败。在静默卸载期间,它不会要求用户提升!
SetInternalUI适用于卸载。例如,以下C ++代码段完全符合您的要求,使卸载完全无声:
INSTALLUILEVEL il = MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
UINT n = MsiConfigureProductEx(productid, INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT, L"REBOOT=R");
并且ConfigureProduct调用使用相同的API。
答案 2 :(得分:0)
只需链接到一个新的答案即可提供更好的答案: 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
}