如何使用C#代码检测“ .Net Framework 4.6.1修补程序”是否已安装在系统上?

问题描述 投票:0回答:1

有时人们安装.net Framework 4.6.1,除非他们还安装了.Net Framework 4.6.1修补程序,否则我的应用程序无法在他们的环境中正常工作。因此,我必须在每个客户端的计算机上明确地进行分类。并编写一个程序来执行此检查以帮助支持人员。

这里是示例代码,它在客户端计算机上检测客户端计算机上是否安装了4.6.1或更高版本,但缺少检查4.6.1修补程序。注意:64位操作系统是必备软件。

    private static bool CheckIfVCInstalledOrNot()
    {
        bool vcInstalled = true;
        try
        {
            if (!Utilities.RedistributablePackage.IsInstalled(Utilities.RedistributablePackageVersion.VC2015to2019x64))
            {
                if (!Utilities.RedistributablePackage.IsInstalled(Utilities.RedistributablePackageVersion.VC2017x64))
                {
                    if (!Utilities.RedistributablePackage.IsInstalled(Utilities.RedistributablePackageVersion.VC2015x64))
                    {
                        if (!Utilities.RedistributablePackage.IsInstalled(Utilities.RedistributablePackageVersion.VC2013x64))
                        {
                            vcInstalled = false;
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Utilities.Logging.ErrorLog(ex);
        }
        return vcInstalled;
    }

public enum RedistributablePackageVersion
{
    VC2013x64,
    VC2015x64,
    VC2017x64,
    VC2015to2019x64
};

public static class RedistributablePackage
{
    /// <summary>
    /// Check if a Microsoft Redistributable Package is installed.
    /// </summary>
    /// <param name="redistributableVersion">The package version to detect.</param>
    /// <returns><c>true</c> if the package is installed, otherwise <c>false</c></returns>
    public static bool IsInstalled(RedistributablePackageVersion redistributableVersion)
    {
        try
        {
            switch (redistributableVersion)
            {
                case RedistributablePackageVersion.VC2015to2019x64:
                    var parametersVc2015to2019x64 = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\DevDiv\VC\Servicing\14.0\RuntimeMinimum", false);
                    if (parametersVc2015to2019x64 == null) return false;
                    var vc2015to2019x64Version = parametersVc2015to2019x64.GetValue("Version");
                    if (((string)vc2015to2019x64Version).StartsWith("14"))
                    {
                        return true;
                    }
                    break;
                case RedistributablePackageVersion.VC2017x64:
                    var paths2017x64 = new List<string>
                    {
                        @"Installer\Dependencies\,,amd64,14.0,bundle",
                        @"Installer\Dependencies\VC,redist.x64,amd64,14.16,bundle" //changed in 14.16.x
                    };
                    foreach (var path in paths2017x64)
                    {
                        var parametersVc2017x64 = Registry.ClassesRoot.OpenSubKey(path, false);
                        if (parametersVc2017x64 == null) continue;
                        var vc2017x64Version = parametersVc2017x64.GetValue("Version");
                        if (vc2017x64Version == null) return false;
                        if (((string)vc2017x64Version).StartsWith("14"))
                        {
                            return true;
                        }
                    }
                    break;
                case RedistributablePackageVersion.VC2015x64:
                    var parametersVc2015x64 = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Classes\Installer\Dependencies\{d992c12e-cab2-426f-bde3-fb8c53950b0d}", false);
                    if (parametersVc2015x64 == null) return false;
                    var vc2015x64Version = parametersVc2015x64.GetValue("Version");
                    if (((string)vc2015x64Version).StartsWith("14"))
                    {
                        return true;
                    }
                    break;
                case RedistributablePackageVersion.VC2013x64:
                    var parametersVc2013x64 = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Classes\Installer\Dependencies\{050d4fc8-5d48-4b8f-8972-47c82c46020f}", false);
                    if (parametersVc2013x64 == null) return false;
                    var vc2013x64Version = parametersVc2013x64.GetValue("Version");
                    if (((string)vc2013x64Version).StartsWith("12"))
                    {
                        return true;
                    }
                    break;
            }
            return false;
        }
        catch (Exception)
        {
            return false;
        }
    }
}
c# .net system-administration
1个回答
0
投票

您需要找到此修补程序的注册表DWORD值,并在注册表中查询该值。

现在,如果您需要hotfix 3154529,则可以看到注册表值为“ 394297”。

因此,从此Table中可以发现,.net Framework 4.6.1的值大于或等于393295,带有修补程序的4.6.1的值应为394297或更大(应用了较新的修补程序或Service Pack)。 >

© www.soinside.com 2019 - 2024. All rights reserved.