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

Check for prerequisite from a .NET Windows Form application

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

我不知道 Click Once 是否是正确的策略?我需要它在安装过程中检查先决条件,如果不存在则通知用户先安装它。如果 Click Once 不是正确的策略,还有其他方法吗?也许我需要先安装我的 Windows Form 应用程序,然后在打开它时检查第三方应用程序?问题在于,安装路径可能因机器而异。我不太确定该怎么做。

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

另一个 link 谈到包括先决条件而不只是检测它们。

一种可能的解决方案是使用此方法检查注册表,returns 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;
}