首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何可靠地检测实际安装的.NET 4.5版本?

如何可靠地检测实际安装的.NET 4.5版本?
EN

Stack Overflow用户
提问于 2012-10-19 18:03:49
回答 5查看 63.3K关注 0票数 54

我的实际问题是,我遇到了两个版本的.NET 4.5完整设置:

  • 是(可能)较旧的版本,在下载SQL Server Data Tools
    • 时也可以使用该版本大小:50,349,920
    • md5:a5e81d1b3905ada0a6e35fd6c6a2e1f4

今天上午从这里下载了一个(可能)更新的

这两种设置的版本都是4.5.50709.17929。在内部,主要的区别是netfx_Full.mzz文件,但在用7-zip解压内容后,我最终得到了许多相同版本的文件,即使文件内容不同(我从大约426个文件中随机检查了大约20个文件),所以我真的分不清哪个是较新的。

有没有一种方法可以可靠地检测已安装的.NET 4.5运行时的实际版本,以便只有在确实需要时才能运行安装程序?

更新

我已经检查了所有426个内容不同的文件,它们在两个设置中都具有相同的ProductVersion和FileVersion。因此,注册表或文件校验和是下一步。

更新2

注册表中列出的两个设置的版本是相同的:4.5.50709

更新3

.NET 4.5.2现已推出:

此版本的.NET框架与.NET框架3.5 SP1及更早版本并行运行,但对.NET框架4、.NET框架4.5和.NET框架4.5.1执行就地更新。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-19 18:38:28

MS最近为.NET 4.5打了补丁,以在某些情况下恢复与.NET 4.0的向后兼容性(请参阅http://blogs.msdn.com/b/dotnet/archive/2012/10/17/net-framework-4-5-off-to-a-great-start.aspx)。

有可能是微软更新了安装程序的这些更改(这样升级到.NET 4.5的用户就不会遇到麻烦),尽管我不知道他们为什么不更改安装程序的版本号。

另外,请注意System.Environment.Version报告的.NET版本号和运行时版本号之间存在差异。后者仍然是4.0.30319。*对于.NET 4.5,只有修订版号更改(随着.NET 4.5更新,以及每个安全更新)。

以下是一些在野外观察到的运行时版本的示例:

Base 4.0

  • 4.0.30319.1 = .NET 4.0 RTM
  • 4.0.30319.269 = Windows XP SP3,7,7 SP1上的.NET 4.0 (使用.NET GDR安全update)
  • 4.0.30319.276 = Windows XP SP3上的.NET 4.0 (4.0.3运行时update)
  • 4.0.30319.276= Windows XP SP3上的.NET 4.0,7(使用MS12-074 GDR安全update)
  • 4.0.30319.1008 = Windows XP SP3,7,7 SP1上的.NET 4.0 (使用MS12-035 LDR安全update)
  • 4.0.30319.1008= Windows XP SP3,7,7 SP1上的.NET 4.0 )(使用MS13-052 GDR安全update)
  • 4.0.30319.1022 = Windows XP SP3,7,7 SP1 (具有MS14-009 GDR安全update)
  • 4.0.30319.1026 = Windows XP SP3上的.NET 4.0、7、7 SP1 (具有MS14-057 GDR安全update)
  • 4.0.30319.2034 = Windows XP SP3上的.NET 4.0、7、7 SP1 (具有MS14-009 LDR安全更新))

4.5

  • 4.0.30319.17626 = RC
  • 4.0.30319.17929 4.5 RTM
  • 4.0.30319.18010 = .NET 4.5 RTM
  • 4.0.30319.18010= .NET 4.5在Windows 8上64-bit
  • 4.0.30319.18063 = SP1 4.5在Windows 7上.NET 4.5 64-bit
  • 4.0.30319.18063= .NET 4.5在Windows 7 SP1 64位(带MS14-009安全更新)

4.5.1

Windows 7上的

  • 4.0.30319.18408 = .NET 4.5.1 SP1 update)
  • 4.0.30319.34014 = Windows 7 SP1 64位上的MS14-009 4.5.1 (在Windows 8.1 64位

上使用MS14-009安全性update)

  • 4.0.30319.34014= .NET 4.5.1

4.5.2

  • 4.0.30319.34209 = .NET 4.5.2 on Windows 7 SP1 64-bit
  • 4.0.30319.34209 = .NET 4.5.2 on Windows 8.1 64位

4.6及更高版本的

  • 4.0.30319.42000

我在Windows Update历史记录中没有看到任何.NET更新,所以我猜v18010的更新是作为KB 2756872的一部分安装的。

更新:显然微软更新了.NET 4.5设置,因为原始下载中的数字签名有错误。KB 2770445

票数 111
EN

Stack Overflow用户

发布于 2015-12-05 16:29:19

代码语言:javascript
复制
public class DA {
    public static class VersionNetFramework {
        public static string Get45or451FromRegistry()
        {//https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx
            using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\"))
            {
                int releaseKey = Convert.ToInt32(ndpKey.GetValue("Release"));
                if (true)
                {
                    return (@"Version: " + CheckFor45DotVersion(releaseKey));
                }
            }
        }
        // Checking the version using >= will enable forward compatibility, 
        // however you should always compile your code on newer versions of
        // the framework to ensure your app works the same.
        private static string CheckFor45DotVersion(int releaseKey)
        {//https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx
            if (releaseKey >= 394271)
                return "4.6.1 installed on all other Windows OS versions or later";
            if (releaseKey >= 394254)
                return "4.6.1 installed on Windows 10 or later";
            if (releaseKey >= 393297)
                return "4.6 installed on all other Windows OS versions or later";
            if (releaseKey >= 393295)
                return "4.6 installed with Windows 10 or later";
            if (releaseKey >= 379893)
                return "4.5.2 or later";
            if (releaseKey >= 378758)
                return "4.5.1 installed on Windows 8, Windows 7 SP1, or Windows Vista SP2 or later";
            if (releaseKey >= 378675)
                return "4.5.1 installed with Windows 8.1 or later";
            if (releaseKey >= 378389)
                return "4.5 or later";

            return "No 4.5 or later version detected";
        }
        public static string GetVersionFromRegistry()
        {//https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx
            string res = @"";
            // Opens the registry key for the .NET Framework entry.
            using (RegistryKey ndpKey =
                RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "").
                OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
            {
                // As an alternative, if you know the computers you will query are running .NET Framework 4.5 
                // or later, you can use:
                // using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, 
                // RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
                foreach (string versionKeyName in ndpKey.GetSubKeyNames())
                {
                    if (versionKeyName.StartsWith("v"))
                    {

                        RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName);
                        string name = (string)versionKey.GetValue("Version", "");
                        string sp = versionKey.GetValue("SP", "").ToString();
                        string install = versionKey.GetValue("Install", "").ToString();
                        if (install == "") //no install info, must be later.
                            res += (versionKeyName + "  " + name) + Environment.NewLine;
                        else
                        {
                            if (sp != "" && install == "1")
                            {
                                res += (versionKeyName + "  " + name + "  SP" + sp) + Environment.NewLine;
                            }

                        }
                        if (name != "")
                        {
                            continue;
                        }
                        foreach (string subKeyName in versionKey.GetSubKeyNames())
                        {
                            RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
                            name = (string)subKey.GetValue("Version", "");
                            if (name != "")
                                sp = subKey.GetValue("SP", "").ToString();
                            install = subKey.GetValue("Install", "").ToString();
                            if (install == "") //no install info, must be later.
                                res += (versionKeyName + "  " + name) + Environment.NewLine;
                            else
                            {
                                if (sp != "" && install == "1")
                                {
                                    res += ("  " + subKeyName + "  " + name + "  SP" + sp) + Environment.NewLine;
                                }
                                else if (install == "1")
                                {
                                    res += ("  " + subKeyName + "  " + name) + Environment.NewLine;
                                }
                            }
                        }
                    }
                }
            }
            return res;
        }
        public static string GetUpdateHistory()
        {//https://msdn.microsoft.com/en-us/library/hh925567(v=vs.110).aspx
            string res=@"";
            using (RegistryKey baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\Updates"))
            {
                foreach (string baseKeyName in baseKey.GetSubKeyNames())
                {
                    if (baseKeyName.Contains(".NET Framework") || baseKeyName.StartsWith("KB") || baseKeyName.Contains(".NETFramework"))
                    {

                        using (RegistryKey updateKey = baseKey.OpenSubKey(baseKeyName))
                        {
                            string name = (string)updateKey.GetValue("PackageName", "");
                            res += baseKeyName + "  " + name + Environment.NewLine;
                            foreach (string kbKeyName in updateKey.GetSubKeyNames())
                            {
                                using (RegistryKey kbKey = updateKey.OpenSubKey(kbKeyName))
                                {
                                    name = (string)kbKey.GetValue("PackageName", "");
                                    res += ("  " + kbKeyName + "  " + name) + Environment.NewLine;

                                    if (kbKey.SubKeyCount > 0)
                                    {
                                        foreach (string sbKeyName in kbKey.GetSubKeyNames())
                                        {
                                            using (RegistryKey sbSubKey = kbKey.OpenSubKey(sbKeyName))
                                            {
                                                name = (string)sbSubKey.GetValue("PackageName", "");
                                                if (name == "")
                                                    name = (string)sbSubKey.GetValue("Description", "");
                                                res += ("    " + sbKeyName + "  " + name) + Environment.NewLine;
                                            }
                                        }
                                    }
                                }
                            }
                        }

                    }
                }
            }
            return res;
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2017-12-17 16:55:27

如果有人需要在表格中排列的.net版本的System.Environment.Version值(需要使用excel执行=Vlookup等)

这是我为此创建的plunker

输入上面的链接,您将能够复制此表映像:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12971881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档