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

时间:2015-04-15 23:53:34

标签: c# wix windows-installer

我无法使用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”形式的东西。答案中链接的参考文章中的示例似乎是错误的。 (或者版本之间发生了一些变化,但我对此表示怀疑。)

3 个答案:

答案 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
  }