54

私の実際の問題は、2 つのバージョンの .NET 4.5 フル セットアップに遭遇したことです。

  • SQL Server Data Tools をダウンロードするときにも利用できる (おそらく) 古いもの
    • サイズ:50,349,920
    • md5:a5e81d1b3905ada0a6e35fd6c6a2e1f4
  • 今朝ここからダウンロードした (おそらく) 新しいもの: http://www.microsoft.com/visualstudio/eng/downloads
    • サイズ:50,352,408
    • md5:d02dc8b69a702a47c083278938c4d2f1

両方のセットアップのバージョンは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 Framework は、.NET Framework 3.5 SP1 以前のバージョンと並行して実行されますが、.NET Framework 4、.NET Framework 4.5、および .NET Framework 4.5.1 のインプレース更新を実行します。

4

5 に答える 5

112

MS は最近、一部のシナリオで .NET 4.0 との下位互換性を復元するために .NET 4.5 にパッチを適用しました ( http://blogs.msdn.com/b/dotnet/archive/2012/10/17/net-framework-4-5-offを参照)。 -to-a-great-start.aspx )。

MSがこれらの変更でセットアップを更新した可能性があります(.NET 4.5にアップグレードするユーザーが互換性の問題に遭遇しないようにするため)、セットアップのバージョン番号を変更しない理由はわかりません.

また、.NET のバージョン番号とランタイムのバージョン番号には違いがあることに注意してくださいSystem.Environment.Version。後者は .NET 4.5 の場合は 4.0.30319.* のままで、リビジョン番号のみが変更されます (.NET 4.5 の更新とすべてのセキュリティ更新で)。

以下は、実際に観察されたランタイム バージョンの例です。

ベース4.0

  • 4.0.30319.1 = .NET 4.0 RTM
  • 4.0.30319.269 = Windows XP SP3、7、7 SP1 上の .NET 4.0 ( MS12-035 GDR セキュリティ アップデートあり)
  • 4.0.30319.276 = Windows XP SP3 上の .NET 4.0 (4.0.3 ランタイム アップデート)
  • 4.0.30319.296 = Windows XP SP3、7 上の .NET 4.0 ( MS12-074 GDR セキュリティ アップデートあり)
  • 4.0.30319.544 = Windows XP SP3、7、7 SP1 上の .NET 4.0 ( MS12-035 LDR セキュリティ アップデートあり)
  • 4.0.30319.1008 = Windows XP SP3、7、7 SP1 上の .NET 4.0 ( MS13-052 GDR セキュリティ アップデートあり)
  • 4.0.30319.1022 = Windows XP SP3、7、7 SP1 上の .NET 4.0 ( MS14-009 GDR セキュリティ アップデートあり)
  • 4.0.30319.1026 = Windows XP SP3、7、7 SP1 上の .NET 4.0 ( MS14-057 GDR セキュリティ アップデートあり)
  • 4.0.30319.2034 = Windows XP SP3、7、7 SP1 上の .NET 4.0 ( MS14-009 LDR セキュリティ アップデートあり)

4.5

  • 4.0.30319.17626 = .NET 4.5 RC
  • 4.0.30319.17929 = .NET 4.5 RTM
  • 4.0.30319.18010 = Windows 8 上の .NET 4.5
  • 4.0.30319.18052 = Windows 7 SP1 64 ビット上の .NET 4.5
  • 4.0.30319.18063 = Windows 7 SP1 64 ビット上の .NET 4.5 ( MS14-009セキュリティ アップデートあり)

4.5.1

  • 4.0.30319.18408 = Windows 7 SP1 64 ビット上の .NET 4.5.1
  • 4.0.30319.18444 = Windows 7 SP1 64 ビット上の .NET 4.5.1 ( MS14-009セキュリティ アップデートあり)
  • 4.0.30319.34014 = Windows 8.1 64 ビット上の .NET 4.5.1

4.5.2

  • 4.0.30319.34209 = Windows 7 SP1 64 ビット上の .NET 4.5.2
  • 4.0.30319.34209 = Windows 8.1 64 ビット上の .NET 4.5.2

4.6 以降

  • 4.0.30319.42000

Windows Update の履歴に .NET の更新が表示されないため、v18010 への更新がKB 2756872の一部としてインストールされたと推測されます。

更新: 元のダウンロードのデジタル署名に間違いがあったため、Microsoft が .NET 4.5 セットアップを更新したようです。KB 2770445

于 2012-10-19T10:38:27.587 に答える
3
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;
        }
    }
}
于 2015-12-05T08:29:19.247 に答える
2

誰かがSystem.Environment.Versionテーブルに配置された.netバージョンに対する値を必要とする場合(=VlookupExcelなどで実行する必要があります...)
、ここに私が作成し たプランカーがあります。
上記のリンクを入力すると、この表の画像をコピーできます。

ここに画像の説明を入力

于 2017-12-17T08:55:26.893 に答える