使用Microsoft.Deployment.WindowsInstaller.Installer.ConfigureProduct以静默方式卸载?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Microsoft.Deployment.WindowsInstaller.Installer.ConfigureProduct以静默方式卸载?相关的知识,希望对你有一定的参考价值。

我无法使用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
  }

以上是关于使用Microsoft.Deployment.WindowsInstaller.Installer.ConfigureProduct以静默方式卸载?的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)