C# 如何以编程方式卸载应用程序

C# 如何以编程方式卸载应用程序,c#,.net,visual-studio-2010,C#,.net,Visual Studio 2010,我尝试以编程方式卸载应用程序。我没有收到任何错误或异常,但应用程序未从我的计算机上卸载。请参阅试用代码 public static string GetUninstallCommandFor(string productDisplayName) { RegistryKey localMachine = Registry.LocalMachine; string productsRoot = @"SOFTWARE\Microsoft\Windows\CurrentVersion\I

我尝试以编程方式卸载应用程序。我没有收到任何错误或异常,但应用程序未从我的计算机上卸载。请参阅试用代码

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以编程方式卸载应用程序。

上述例程将返回一个字符串,假设它找到了一个匹配项,可能如下所示:

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

您需要将其作为一个进程运行:

System.Diagnostics.Process.StartuninstallString

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


更新:如果您使用的是Windows installer 3.0或更高版本,还可以使用/quiet进行静默安装/卸载。如果您使用的是旧版本,那么它基本上与/qn相同。谢谢@JRO的介绍

上述例程将返回一个字符串,假设它找到一个匹配项,该匹配项可能如下所示:

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

您需要将其作为一个进程运行:

System.Diagnostics.Process.StartuninstallString

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


更新:如果您使用的是Windows installer 3.0或更高版本,还可以使用/quiet进行静默安装/卸载。如果您使用的是旧版本,那么它基本上与/qn相同。谢谢@JRO的介绍

您是否尝试过调试以查看productDisplayName字符串在循环中是否匹配?你试过调试吗?通过这样做,您可以打印每个产品的名称并搜索您的产品是否正确,空格是否替换为下划线,等等…@Kilazur是的,它匹配并进入了if条件,但safari未卸载。请帮助我。那么您如何处理卸载命令?它看起来像什么?正如@Alex所指出的,据我所知,这个方法不会自行卸载。它返回一个卸载命令,必须在其他地方使用该命令才能实际执行卸载。@AlexK。请告诉我如何执行卸载。您是否尝试过调试以查看您的productDisplayName字符串在循环中是否匹配?你试过调试吗?通过这样做,您可以打印每个产品的名称并搜索您的产品是否正确,空格是否替换为下划线,等等…@Kilazur是的,它匹配并进入了if条件,但safari未卸载。请帮助我。那么您如何处理卸载命令?它看起来像什么?正如@Alex所指出的,据我所知,这个方法不会自行卸载。它返回一个卸载命令,必须在其他地方使用该命令才能实际执行卸载。@AlexK。请告诉我如何执行卸载。/q未显示修复/删除屏幕,但应用程序未卸载,在屏幕中,默认情况下选择了修复选项。请查看卸载字符串是否包含/x或/f/f用于维修。如果它包含/f,则可以在执行之前手动替换/x。从命令行进行试运行可能会有所帮助。另外,如果需要UAC,则需要在Process.Start.This中传递该信息。这与installer.cs分开工作,我想在当前应用程序的安装过程中卸载2应用程序。因此,我在installer.cs的beforeuninstall方法中调用了此卸载过程。当我在installer.cs调用此过程时,它不是卸载应用程序,而是显示屏幕准备卸载,该屏幕突然关闭。但除了installer.cs它正在工作。是否知道如何调试,以及在installer.cs中调用卸载程序方法时不卸载应用程序可能出现的问题。不知道。您可以尝试添加/l*v uninstall.log标志,并查看生成的日志文件以查看故障原因。您需要使用/quiet以静默方式卸载。/q未显示修复/删除屏幕,但应用程序未卸载,并且在屏幕中,默认情况下选择了修复选项。查看卸载字符串是否包含/x或/f/f用于维修。如果它包含/f,则可以在执行之前手动替换/x。从命令行进行试运行可能会有所帮助。另外,如果需要UAC,则需要在Process.Start.This中传递该信息。这与installer.cs分开工作,我想在当前应用程序的安装过程中卸载2应用程序。因此,我在installer.cs的beforeuninstall方法中调用了此卸载过程。当我在installer.cs调用此过程时,它不是卸载应用程序,而是显示屏幕准备卸载,该屏幕突然关闭。但除了installer.cs它是wor
king.知道如何调试,以及在installer.cs中调用卸载程序方法时不卸载应用程序会出现什么问题吗?不知道。您可以尝试添加/l*v uninstall.log标志,并查看生成的日志文件以查看导致失败的原因。您需要使用/quiet以静默方式卸载。