【问题标题】:Check for prerequisite from a .NET Windows Form application从 .NET Windows 窗体应用程序检查先决条件
【发布时间】:2015-10-11 01:11:29
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# .net winforms clickonce


    【解决方案1】:

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

    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;
    }
    

    【讨论】:

    • 我会试试这个,我怎么知道p_name的正确应用程序名称?我是否使用exe 的名称?
    • 嗯,首先我会在您可以在代码中找到的三个位置之一手动找到该程序。例如:HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\YourProgramName\DispayName 并检查那里写入的值,然后以编程方式将此值与此方法一起使用。
    猜你喜欢
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多