从.NET Windows窗体应用程序检查先决条件

时间:2015-10-10 17:02:58

标签: c# .net winforms clickonce

我想在安装.NET Windows Form application期间或打开时检查第三方应用程序的安装情况。我的Windows窗体应用程序不需要运行第三方应用程序,但它确实需要它才能使功能正常工作。例如,My Windows Form应用程序打开第三方应用程序,例如邮件程序。

我不知道Click Once是否是正确的策略?我需要它来检查安装过程中的先决条件,如果没有,则通知用户先安装它。如果Click Once不是正确的策略,还有另一种方法吗?也许我需要首先安装我的Windows窗体应用程序,然后在打开它时检查第三方应用程序?问题是,安装路径可能因机器而异。我真的不确定如何解决这个问题。

link解释了如何在Click Once中包含先决条件,但这不是我想要做的。

另一个link讨论了包含先决条件但不仅仅是检测它们。

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是使用此方法检查注册表,该方法返回bool值,指示是否存在具有应用程序名称的注册表记录:

public static bool IsApplictionInstalled(string p_name)
{
    string displayName;
    RegistryKey key;

    // search in: CurrentUser
    key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
    foreach (String keyName in key.GetSubKeyNames())
    {
        RegistryKey subkey = key.OpenSubKey(keyName);
        displayName = subkey.GetValue("DisplayName") as string;
        if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
        {
            return true;
        }
    }

    // search in: LocalMachine_32
    key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
    foreach (String keyName in key.GetSubKeyNames())
    {
        RegistryKey subkey = key.OpenSubKey(keyName);
        displayName = subkey.GetValue("DisplayName") as string;
        if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
        {
            return true;
        }
    }

    // search in: LocalMachine_64
    key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
    foreach (String keyName in key.GetSubKeyNames())
    {
        RegistryKey subkey = key.OpenSubKey(keyName);
        displayName = subkey.GetValue("DisplayName") as string;
        if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
        {
            return true;
        }
    }

    // NOT FOUND
    return false;
}