【问题标题】:How to uninstall application programmatically如何以编程方式卸载应用程序
【发布时间】:2014-11-03 17:56:25
【问题描述】:

我尝试this,this 以编程方式卸载应用程序。我没有收到任何错误或异常,但应用程序没有从我的机器上卸载。也请查看尝试过的代码

public static string GetUninstallCommandFor(string productDisplayName)
{
    RegistryKey localMachine = Registry.LocalMachine;
    string productsRoot = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products";
    RegistryKey products = localMachine.OpenSubKey(productsRoot);
    string[] productFolders = products.GetSubKeyNames();

    foreach (string p in productFolders)
    {
        RegistryKey installProperties = products.OpenSubKey(p + @"\InstallProperties");
        if (installProperties != null)
        {
            string displayName = (string)installProperties.GetValue("DisplayName");
            if ((displayName != null) && (displayName.Contains(productDisplayName)))
            {
                string uninstallCommand =(string)installProperties.GetValue("UninstallString");

                return uninstallCommand;
            }
        }
    }

    return "";        
}

请帮助我使用 C# 以编程方式卸载应用程序。

【问题讨论】:

  • 您是否尝试调试以查看您的productDisplayName 字符串是否曾经在您的循环中匹配?您是否尝试过调试?通过这样做,您可以打印每个产品的名称并搜索您的名称是否正确(错字、空格替换为下划线等...)。
  • @Kilazur 是的,它匹配并进入 if 条件,但未卸载 safari。请帮助我。
  • 那么你如何处理uninstallCommand ?它看起来像什么?
  • 正如@Alex 指出的那样,据我所知,此方法不会自行卸载。它返回一个uninstallCommand,必须在其他地方使用它才能实际执行卸载。
  • @AlexK。你能告诉我如何执行卸载。

标签: c# .net visual-studio-2010


【解决方案1】:

上面的例程将返回一个字符串,假设它找到了一个可能看起来像这样的匹配:

MsiExec.exe /X{02DA0248-DB55-44A7-8DC6-DBA573AEEA94}

你需要把它作为一个进程运行:

System.Diagnostics.Process.Start(uninstallString);

注意它可能并不总是 msiexec,它可以是程序选择指定的任何内容。对于 msiexec,您可以将 /q 参数附加到您的 uninstallString 以使其静默卸载(并且不会显示那些修复/删除对话框)。

更新:如果您使用的是 Windows 安装程序 3.0 或更高版本,您还可以使用/quiet 进行静默安装/卸载。它与/qn 基本相同(如果您使用的是旧版本)。 Source。感谢@JRO 提出!

【讨论】:

  • "/q" 未显示修复/删除屏幕,但应用程序未卸载且在屏幕中,默认选择修复选项。
  • 查看卸载字符串是否包含/x/f。 /f 用于修复。如果它包含/f,那么您可以在执行之前手动替换它/x。从命令行进行试运行可能会有所帮助。此外,如果需要 UAC,则需要在 Process.Start 中传递它。
  • 这与installer.cs 不同,我想在当前应用程序的安装过程中卸载2 个应用程序。所以我在installer.cs 中的 beforeuninstall 方法中调用了这个卸载过程。当我调用这个时在installer.cs它没有卸载应用程序它显示屏幕为“准备卸载”并且该屏幕突然关闭。但除了installer.cs它正在工作。任何想法如何调试以及不卸载可能是什么问题在installer.cs中调用卸载程序方法时的应用程序。
  • 不知道。您可以尝试添加/l*v uninstall.log 标志并查看生成的日志文件以查看导致失败的原因。
  • 您需要使用“/quiet”才能静默卸载。
猜你喜欢
  • 2019-08-05
  • 2012-03-17
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 2019-05-11
相关资源
最近更新 更多