C# 有没有一种简单的方法来检查.NET Framework版本?
问题是我需要知道它是否是3.5版SP 1C# 有没有一种简单的方法来检查.NET Framework版本?,c#,.net,C#,.net,问题是我需要知道它是否是3.5版SP 1Environment.Version()仅返回2.0.50727.3053 我发现了,但我认为这将需要更多的时间比它的价值,所以我正在寻找一个更简单的。有可能吗?AFAIK框架中没有内置的方法允许您这样做。您可以通过阅读windows注册表值来查看这篇文章,以获得关于确定框架版本的建议。类似的内容应该可以做到这一点。只需从注册表中获取值 对于.NET 1-4: Framework是安装的最高版本,SP是该版本的服务包 RegistryKey instal
Environment.Version()
仅返回2.0.50727.3053
我发现了,但我认为这将需要更多的时间比它的价值,所以我正在寻找一个更简单的。有可能吗?AFAIK框架中没有内置的方法允许您这样做。您可以通过阅读windows注册表值来查看这篇文章,以获得关于确定框架版本的建议。类似的内容应该可以做到这一点。只需从注册表中获取值 对于.NET 1-4:
Framework
是安装的最高版本,SP
是该版本的服务包
RegistryKey installed_versions = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP");
string[] version_names = installed_versions.GetSubKeyNames();
//version names start with 'v', eg, 'v3.5' which needs to be trimmed off before conversion
double Framework = Convert.ToDouble(version_names[version_names.Length - 1].Remove(0, 1), CultureInfo.InvariantCulture);
int SP = Convert.ToInt32(installed_versions.OpenSubKey(version_names[version_names.Length - 1]).GetValue("SP", 0));
适用于.NET 4.5+(来自):
Environment.Version()
正在为不同的问题提供正确答案。在.NET 2.0、3和3.5中使用了相同版本的CLR。我想您可以查看在随后的每个版本中添加的库。谢谢您的这篇非常有用的文章。
为了检查Framework2.0,我不得不对它进行一些调整,因为注册表项不能直接转换为双精度。代码如下:
string[] version_names = rk.GetSubKeyNames();
//version names start with 'v', eg, 'v3.5'
//we also need to take care of strings like v2.0.50727...
string sCurrent = version_names[version_names.Length - 1].Remove(0, 1);
if (sCurrent.LastIndexOf(".") > 1)
{
string[] sSplit = sCurrent.Split('.');
sCurrent = sSplit[0] + "." + sSplit[1] + sSplit[2];
}
double dCurrent = Convert.ToDouble(sCurrent, System.Globalization.CultureInfo.InvariantCulture);
double dExpected = Convert.ToDouble(sExpectedVersion);
if (dCurrent >= dExpected)
试试这个:
string GetFrameWorkVersion()
{
return System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion();
}
有点大,但看起来像是最新的Microsoft oddities:
public static class Versions
{
static Version
_NET;
static SortedList<String,Version>
_NETInstalled;
#if NET40
#else
public static bool VersionTry(String S, out Version V)
{
try
{
V=new Version(S);
return true;
}
catch
{
V=null;
return false;
}
}
#endif
const string _NetFrameWorkKey = "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP";
static void FillNetInstalled()
{
if (_NETInstalled == null)
{
_NETInstalled = new SortedList<String, Version>(StringComparer.InvariantCultureIgnoreCase);
RegistryKey
frmks = Registry.LocalMachine.OpenSubKey(_NetFrameWorkKey);
string[]
names = frmks.GetSubKeyNames();
foreach (string name in names)
{
if (name.StartsWith("v", StringComparison.InvariantCultureIgnoreCase) && name.Length > 1)
{
string
f, vs;
Version
v;
vs = name.Substring(1);
if (vs.IndexOf('.') < 0)
vs += ".0";
#if NET40
if (Version.TryParse(vs, out v))
#else
if (VersionTry(vs, out v))
#endif
{
f = String.Format("{0}.{1}", v.Major, v.Minor);
#if NET40
if (Version.TryParse((string)frmks.OpenSubKey(name).GetValue("Version"), out v))
#else
if (VersionTry((string)frmks.OpenSubKey(name).GetValue("Version"), out v))
#endif
{
if (!_NETInstalled.ContainsKey(f) || v.CompareTo(_NETInstalled[f]) > 0)
_NETInstalled[f] = v;
}
else
{ // parse variants
Version
best = null;
if (_NETInstalled.ContainsKey(f))
best = _NETInstalled[f];
string[]
varieties = frmks.OpenSubKey(name).GetSubKeyNames();
foreach (string variety in varieties)
#if NET40
if (Version.TryParse((string)frmks.OpenSubKey(name + '\\' + variety).GetValue("Version"), out v))
#else
if (VersionTry((string)frmks.OpenSubKey(name + '\\' + variety).GetValue("Version"), out v))
#endif
{
if (best == null || v.CompareTo(best) > 0)
{
_NETInstalled[f] = v;
best = v;
}
vs = f + '.' + variety;
if (!_NETInstalled.ContainsKey(vs) || v.CompareTo(_NETInstalled[vs]) > 0)
_NETInstalled[vs] = v;
}
}
}
}
}
}
} // static void FillNetInstalled()
public static Version NETInstalled
{
get
{
FillNetInstalled();
return _NETInstalled[_NETInstalled.Keys[_NETInstalled.Count-1]];
}
} // NETInstalled
public static Version NET
{
get
{
FillNetInstalled();
string
clr = String.Format("{0}.{1}", Environment.Version.Major, Environment.Version.Minor);
Version
found = _NETInstalled[_NETInstalled.Keys[_NETInstalled.Count-1]];
if(_NETInstalled.ContainsKey(clr))
return _NETInstalled[clr];
for (int i = _NETInstalled.Count - 1; i >= 0; i--)
if (_NETInstalled.Keys[i].CompareTo(clr) < 0)
return found;
else
found = _NETInstalled[_NETInstalled.Keys[i]];
return found;
}
} // NET
}
公共静态类版本
{
静态版本
_净额;
静态分类列表
_网络安装;
#如果NET40
#否则
公共静态布尔版本控制(字符串S,输出版本V)
{
尝试
{
V=新版本;
返回true;
}
抓住
{
V=零;
返回false;
}
}
#恩迪夫
常量字符串\u NetFrameWorkKey=“SOFTWARE\\Microsoft\\NET Framework Setup\\NDP”;
静态void FillNetInstalled()
{
如果(_NETInstalled==null)
{
_NETInstalled=新的分类列表(StringComparer.InvariantCultureInogoreCase);
注册表项
frmks=Registry.LocalMachine.OpenSubKey(\u NetFrameWorkKey);
字符串[]
name=frmks.GetSubKeyNames();
foreach(名称中的字符串名称)
{
if(name.StartsWith(“v”,StringComparison.invariantCultureInogoreCase)和&name.Length>1)
{
一串
f、 vs;
版本
v
vs=名称子字符串(1);
if(vs.IndexOf('.')<0)
vs+=“.0”;
#如果NET40
if(TryParse版本(vs,out v))
#否则
if(版本控制(vs,out v))
#恩迪夫
{
f=String.Format(“{0}.{1}”,v.Major,v.Minor);
#如果NET40
if(Version.TryParse((字符串)frmks.OpenSubKey(name.GetValue(“Version”),out v))
#否则
if(VersionTry((字符串)frmks.OpenSubKey(name.GetValue(“版本”),out v))
#恩迪夫
{
如果(!_NETInstalled.ContainsKey(f)| | v.CompareTo(_NETInstalled[f])>0)
_NETInstalled[f]=v;
}
其他的
{//解析变量
版本
最佳=零;
如果(_netstalled.ContainsKey(f))
最佳=_netstalled[f];
字符串[]
variates=frmks.OpenSubKey(name).GetSubKeyNames();
foreach(各种各样的字符串)
#如果NET40
if(Version.TryParse((字符串)frmks.OpenSubKey(name+'\\'+variation).GetValue(“Version”),out v))
#否则
if(versionstry((字符串)frmks.OpenSubKey(name+'\\'+variation.GetValue(“Version”),out v))
#恩迪夫
{
如果(最佳==null | | v.CompareTo(最佳)>0)
{
_NETInstalled[f]=v;
最佳=v;
}
vs=f+'。+品种;
如果(!_NETInstalled.ContainsKey(vs)| | v.CompareTo(_NETInstalled[vs])>0)
_NETInstalled[vs]=v;
}
}
}
}
}
}
}//静态void FillNetInstalled()
已安装公共静态版本
{
得到
{
FillNetInstalled();
返回_NETInstalled[_NETInstalled.Keys[_NETInstalled.Count-1]];
}
}//已安装
公共静态版本网
{
得到
{
FillNetInstalled();
一串
clr=String.Format(“{0}.{1}”,Environment.Version.Major,Environment.Version.Minor);
版本
找到=_NETInstalled[_NETInstalled.Keys[_NETInstalled.Count-1];
如果(_netstalled.ContainsKey(clr))
返回已安装的[clr];
对于(int i=\u NETInstalled.Count-1;i>=0;i--)
if(_NETInstalled.Keys[i].CompareTo(clr)<0)
发现退货;
其他的
发现=_NETInstalled[_NETInstalled.Keys[i]];
发现退货;
}
}//净
public static class Versions
{
static Version
_NET;
static SortedList<String,Version>
_NETInstalled;
#if NET40
#else
public static bool VersionTry(String S, out Version V)
{
try
{
V=new Version(S);
return true;
}
catch
{
V=null;
return false;
}
}
#endif
const string _NetFrameWorkKey = "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP";
static void FillNetInstalled()
{
if (_NETInstalled == null)
{
_NETInstalled = new SortedList<String, Version>(StringComparer.InvariantCultureIgnoreCase);
RegistryKey
frmks = Registry.LocalMachine.OpenSubKey(_NetFrameWorkKey);
string[]
names = frmks.GetSubKeyNames();
foreach (string name in names)
{
if (name.StartsWith("v", StringComparison.InvariantCultureIgnoreCase) && name.Length > 1)
{
string
f, vs;
Version
v;
vs = name.Substring(1);
if (vs.IndexOf('.') < 0)
vs += ".0";
#if NET40
if (Version.TryParse(vs, out v))
#else
if (VersionTry(vs, out v))
#endif
{
f = String.Format("{0}.{1}", v.Major, v.Minor);
#if NET40
if (Version.TryParse((string)frmks.OpenSubKey(name).GetValue("Version"), out v))
#else
if (VersionTry((string)frmks.OpenSubKey(name).GetValue("Version"), out v))
#endif
{
if (!_NETInstalled.ContainsKey(f) || v.CompareTo(_NETInstalled[f]) > 0)
_NETInstalled[f] = v;
}
else
{ // parse variants
Version
best = null;
if (_NETInstalled.ContainsKey(f))
best = _NETInstalled[f];
string[]
varieties = frmks.OpenSubKey(name).GetSubKeyNames();
foreach (string variety in varieties)
#if NET40
if (Version.TryParse((string)frmks.OpenSubKey(name + '\\' + variety).GetValue("Version"), out v))
#else
if (VersionTry((string)frmks.OpenSubKey(name + '\\' + variety).GetValue("Version"), out v))
#endif
{
if (best == null || v.CompareTo(best) > 0)
{
_NETInstalled[f] = v;
best = v;
}
vs = f + '.' + variety;
if (!_NETInstalled.ContainsKey(vs) || v.CompareTo(_NETInstalled[vs]) > 0)
_NETInstalled[vs] = v;
}
}
}
}
}
}
} // static void FillNetInstalled()
public static Version NETInstalled
{
get
{
FillNetInstalled();
return _NETInstalled[_NETInstalled.Keys[_NETInstalled.Count-1]];
}
} // NETInstalled
public static Version NET
{
get
{
FillNetInstalled();
string
clr = String.Format("{0}.{1}", Environment.Version.Major, Environment.Version.Minor);
Version
found = _NETInstalled[_NETInstalled.Keys[_NETInstalled.Count-1]];
if(_NETInstalled.ContainsKey(clr))
return _NETInstalled[clr];
for (int i = _NETInstalled.Count - 1; i >= 0; i--)
if (_NETInstalled.Keys[i].CompareTo(clr) < 0)
return found;
else
found = _NETInstalled[_NETInstalled.Keys[i]];
return found;
}
} // NET
}
private static void GetVersionFromRegistry()
{
// 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.
Console.WriteLine(versionKeyName + " " + name);
else
{
if (sp != "" && install == "1")
{
Console.WriteLine(versionKeyName + " " + name + " SP" + sp);
}
}
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.
Console.WriteLine(versionKeyName + " " + name);
else
{
if (sp != "" && install == "1")
{
Console.WriteLine(" " + subKeyName + " " + name + " SP" + sp);
}
else if (install == "1")
{
Console.WriteLine(" " + subKeyName + " " + name);
}
}
}
}
}
}
}
// 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)
{
if (releaseKey >= 393295) {
return "4.6 or later";
}
if ((releaseKey >= 379893)) {
return "4.5.2 or later";
}
if ((releaseKey >= 378675)) {
return "4.5.1 or later";
}
if ((releaseKey >= 378389)) {
return "4.5 or later";
}
// This line should never execute. A non-null release key should mean
// that 4.5 or later is installed.
return "No 4.5 or later version detected";
}
private static void Get45or451FromRegistry()
{
using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\")) {
if (ndpKey != null && ndpKey.GetValue("Release") != null) {
Console.WriteLine("Version: " + CheckFor45DotVersion((int) ndpKey.GetValue("Release")));
}
else {
Console.WriteLine("Version 4.5 or later is not detected.");
}
}
}
using System;
using System.Reflection;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Win32;
namespace stackoverflowtesting
{
class Program
{
static void Main(string[] args)
{
Dictionary<int, String> mappings = new Dictionary<int, string>();
mappings[378389] = "4.5";
mappings[378675] = "4.5.1 on Windows 8.1";
mappings[378758] = "4.5.1 on Windows 8, Windows 7 SP1, and Vista";
mappings[379893] = "4.5.2";
mappings[393295] = "4.6 on Windows 10";
mappings[393297] = "4.6 on Windows not 10";
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)
{
Console.WriteLine("Version: " + mappings[releaseKey]);
}
}
int a = Console.Read();
}
}
}
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;
}
}
private void Form1_Shown(object sender, EventArgs e)
{
//
// Current OS Information
//
richTextBox1.Text = @"Current OS Information:";
richTextBox1.AppendText(Environment.NewLine +
"Machine Name: " + Environment.MachineName);
richTextBox1.AppendText(Environment.NewLine +
"Platform: " + Environment.OSVersion.Platform.ToString());
richTextBox1.AppendText(Environment.NewLine +
Environment.OSVersion);
//
// .NET Framework Environment Information
//
richTextBox1.AppendText(Environment.NewLine + Environment.NewLine +
".NET Framework Environment Information:");
richTextBox1.AppendText(Environment.NewLine +
"Environment.Version " + Environment.Version);
richTextBox1.AppendText(Environment.NewLine +
DA.VersionNetFramework.GetVersionDicription());
//
// .NET Framework Information From Registry
//
richTextBox1.AppendText(Environment.NewLine + Environment.NewLine +
".NET Framework Information From Registry:");
richTextBox1.AppendText(Environment.NewLine +
DA.VersionNetFramework.GetVersionFromRegistry());
//
// .NET Framework 4.5 or later Information From Registry
//
richTextBox1.AppendText(Environment.NewLine +
".NET Framework 4.5 or later Information From Registry:");
richTextBox1.AppendText(Environment.NewLine +
DA.VersionNetFramework.Get45or451FromRegistry());
//
// Update History
//
richTextBox1.AppendText(Environment.NewLine + Environment.NewLine +
"Update History");
richTextBox1.AppendText(Environment.NewLine +
DA.VersionNetFramework.GetUpdateHistory());
//
// Setting Cursor to first character of textbox
//
if (!richTextBox1.Text.Equals(""))
{
richTextBox1.SelectionStart = 1;
}
}
public class DA
{
public static class VersionNetFramework
{
public static string GetVersion()
{
return Environment.Version.ToString();
}
public static string GetVersionDicription()
{
int Major = Environment.Version.Major;
int Minor = Environment.Version.Minor;
int Build = Environment.Version.Build;
int Revision = Environment.Version.Revision;
//http://dzaebel.net/NetVersionen.htm
//http://stackoverflow.com/questions/12971881/how-to-reliably-detect-the-actual-net-4-5-version-installed
//4.0.30319.42000 = .NET 4.6 on Windows 8.1 64 - bit
if ((Major >=4) && (Minor >=0) && (Build >= 30319) && (Revision >= 42000))
return @".NET 4.6 on Windows 8.1 64 - bit or later";
//4.0.30319.34209 = .NET 4.5.2 on Windows 8.1 64 - bit
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 34209))
return @".NET 4.5.2 on Windows 8.1 64 - bit or later";
//4.0.30319.34209 = .NET 4.5.2 on Windows 7 SP1 64 - bit
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 34209))
return @".NET 4.5.2 on Windows 7 SP1 64 - bit or later";
//4.0.30319.34014 = .NET 4.5.1 on Windows 8.1 64 - bit
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 34014))
return @".NET 4.5.1 on Windows 8.1 64 - bit or later";
//4.0.30319.18444 = .NET 4.5.1 on Windows 7 SP1 64 - bit(with MS14 - 009 security update)
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 18444))
return @".NET 4.5.1 on Windows 7 SP1 64 - bit(with MS14 - 009 security update) or later";
//4.0.30319.18408 = .NET 4.5.1 on Windows 7 SP1 64 - bit
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 18408))
return @".NET 4.5.1 on Windows 7 SP1 64 - bit or later";
//4.0.30319.18063 = .NET 4.5 on Windows 7 SP1 64 - bit(with MS14 - 009 security update)
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 18063))
return @".NET 4.5 on Windows 7 SP1 64 - bit(with MS14 - 009 security update) or later";
//4.0.30319.18052 = .NET 4.5 on Windows 7 SP1 64 - bit
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 18052))
return @".NET 4.5 on Windows 7 SP1 64 - bit or later";
//4.0.30319.18010 = .NET 4.5 on Windows 8
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 18010))
return @".NET 4.5 on Windows 8 or later";
//4.0.30319.17929 = .NET 4.5 RTM
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 17929))
return @".NET 4.5 RTM or later";
//4.0.30319.17626 = .NET 4.5 RC
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 17626))
return @".NET 4.5 RC or later";
//4.0.30319.17020.NET 4.5 Preview, September 2011
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 17020))
return @".NET 4.5 Preview, September 2011 or later";
//4.0.30319.2034 = .NET 4.0 on Windows XP SP3, 7, 7 SP1(with MS14 - 009 LDR security update)
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 2034))
return @".NET 4.0 on Windows XP SP3, 7, 7 SP1(with MS14 - 009 LDR security update) or later";
//4.0.30319.1026 = .NET 4.0 on Windows XP SP3, 7, 7 SP1(with MS14 - 057 GDR security update)
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 1026))
return @".NET 4.0 on Windows XP SP3, 7, 7 SP1(with MS14 - 057 GDR security update) or later";
//4.0.30319.1022 = .NET 4.0 on Windows XP SP3, 7, 7 SP1(with MS14 - 009 GDR security update)
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 1022))
return @".NET 4.0 on Windows XP SP3, 7, 7 SP1(with MS14 - 009 GDR security update) or later";
//4.0.30319.1008 = .NET 4.0 on Windows XP SP3, 7, 7 SP1(with MS13 - 052 GDR security update)
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 1008))
return @".NET 4.0 on Windows XP SP3, 7, 7 SP1(with MS13 - 052 GDR security update) or later";
//4.0.30319.544 = .NET 4.0 on Windows XP SP3, 7, 7 SP1(with MS12 - 035 LDR security update)
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 544))
return @".NET 4.0 on Windows XP SP3, 7, 7 SP1(with MS12 - 035 LDR security update) or later";
//4.0.30319.447 yes built by: RTMLDR, .NET 4.0 Platform Update 1, April 2011
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 447))
return @"built by: RTMLDR, .NET 4.0 Platform Update 1, April 2011 or later";
//4.0.30319.431 yes built by: RTMLDR, .NET 4.0 GDR Update, March 2011 / with VS 2010 SP1 / or.NET 4.0 Update
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 431))
return @"built by: RTMLDR, .NET 4.0 GDR Update, March 2011 / with VS 2010 SP1 / or.NET 4.0 Update or later";
//4.0.30319.296 = .NET 4.0 on Windows XP SP3, 7(with MS12 - 074 GDR security update)
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 296))
return @".NET 4.0 on Windows XP SP3, 7(with MS12 - 074 GDR security update) or later";
//4.0.30319.276 = .NET 4.0 on Windows XP SP3 (4.0.3 Runtime update)
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 276))
return @".NET 4.0 on Windows XP SP3 (4.0.3 Runtime update) or later";
//4.0.30319.269 = .NET 4.0 on Windows XP SP3, 7, 7 SP1(with MS12 - 035 GDR security update)
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 269))
return @".NET 4.0 on Windows XP SP3, 7, 7 SP1(with MS12 - 035 GDR security update) or later";
//4.0.30319.1 yes built by: RTMRel, .NET 4.0 RTM Release, April 2010
if ((Major >= 4) && (Minor >= 0) && (Build >= 30319) && (Revision >= 1))
return @"built by: RTMRel, .NET 4.0 RTM Release, April 2010 or later";
//4.0.30128.1 built by: RC1Rel, .NET 4.0 Release Candidate, Feb 2010
if ((Major >=4) && (Minor >=0) && (Build >= 30128) && (Revision >= 1))
return @"built by: RC1Rel, .NET 4.0 Release Candidate, Feb 2010 or later";
//4.0.21006.1 built by: B2Rel, .NET 4.0 Beta2, Oct 2009
if ((Major >=4) && (Minor >=0) && (Build >= 21006) && (Revision >=1))
return @"built by: B2Rel, .NET 4.0 Beta2, Oct 2009 or later";
//4.0.20506.1 built by: Beta1, .NET 4.0 Beta1, May 2009
if ((Major >=4) && (Minor >=0) && (Build >= 20506) && (Revision >=1))
return @"built by: Beta1, .NET 4.0 Beta1, May 2009 or later";
//4.0.11001.1 built by: CTP2 VPC, .NET 4.0 CTP, October 2008
if ((Major >=4) && (Minor >=0) && (Build >= 11001) && (Revision >=1))
return @"built by: CTP2 VPC, .NET 4.0 CTP, October 2008 or later";
//3.5.30729.5420 yes built by: Win7SP1, .NET 3.5.1 Sicherheits - Update, 12 April 2011
if ((Major >=3) && (Minor >=5) && (Build >= 30729) && (Revision >= 5420))
return @"built by: Win7SP1, .NET 3.5.1 Sicherheits - Update, 12 April 2011 or later";
//3.5.30729.5004 yes built by: NetFXw7 / Windows 7..Rel., Jan 2010 / +Data functions KB976127 .NET 3.5 SP1
if ((Major >=3) && (Minor >=5) && (Build >= 30729) && (Revision >= 5004))
return @"built by: NetFXw7 / Windows 7..Rel., Jan 2010 / +Data functions KB976127 .NET 3.5 SP1 or later";
//3.5.30729.4466 yes built by: NetFXw7 / Windows XP..Rel. , Jan 2010 / +Data functions KB976127 .NET 3.5 SP1
if ((Major >=3) && (Minor >=5) && (Build >= 30729) && (Revision >= 4466))
return @"built by: NetFXw7 / Windows XP..Rel. , Jan 2010 / +Data functions KB976127 .NET 3.5 SP1 or later";
//3.5.30729.4926 yes built by: NetFXw7 / Windows 7 Release, Oct 2009 / .NET 3.5 SP1 + Hotfixes
if ((Major >=3) && (Minor >=5) && (Build >= 30729) && (Revision >= 4926))
return @"built by: NetFXw7 / Windows 7 Release, Oct 2009 / .NET 3.5 SP1 + Hotfixes or later";
//3.5.30729.4918 built by: NetFXw7 / Windows 7 Release Candidate, June 2009
if ((Major >=3) && (Minor >=5) && (Build >= 30729) && (Revision >= 4918))
return @"built by: NetFXw7 / Windows 7 Release Candidate, June 2009 or later";
//3.5.30729.196 yes built by: QFE, .NET 3.5 Family Update Vista / W2008, Dec 2008
if ((Major >= 3) && (Minor >= 5) && (Build >= 30729) && (Revision >=196))
return @"built by: QFE, .NET 3.5 Family Update Vista / W2008, Dec 2008 or later";
//3.5.30729.1 yes built by: SP, .NET 3.5 SP1, Aug 2008
if ((Major >= 3) && (Minor >= 5) && (Build >= 30729) && (Revision >=1))
return @"built by: SP, .NET 3.5 SP1, Aug 2008 or later";
//3.5.30428.1 built by: SP1Beta1, .NET 3.5 SP1 BETA1, May 2008
if ((Major >=3) && (Minor >=5) && (Build >= 30428) && (Revision >=1))
return @"built by: SP1Beta1, .NET 3.5 SP1 BETA1, May 2008 or later";
//3.5.21022.8 yes built by: RTM, Jan 2008
if ((Major >=3) && (Minor >=5) && (Build >= 21022) && (Revision >= 8))
return @"built by: RTM, Jan 2008 or later";
//3.5.20706.1 built by: Beta2, Orcas Beta2, Oct 2007
if ((Major >=3) && (Minor >=5) && (Build >= 20706) && (Revision >= 1))
return @"built by: Beta2, Orcas Beta2, Oct 2007 or later";
//3.5.20526.0 built by: MCritCTP, Orcas Beta1, Mar 2007
if ((Major >=3) && (Minor >=5) && (Build >= 20526) && (Revision >=0))
return @"built by: MCritCTP, Orcas Beta1, Mar 2007 or later";
//3.0.6920.1500 yes built by: QFE, Family Update Vista / W2008, Dez 2008, KB958483
if ((Major >=3) && (Minor >=0) && (Build >= 6920) && (Revision >= 1500))
return @"built by: QFE, Family Update Vista / W2008, Dez 2008, KB958483 or later";
//3.0.4506.4926 yes(NetFXw7.030729 - 4900) / Windows 7 Release, Oct 2009
if ((Major >=3) && (Minor >=0) && (Build >= 4506) && (Revision >= 4926))
return @"(NetFXw7.030729 - 4900) / Windows 7 Release, Oct 2009 or later";
//3.0.4506.4918(NetFXw7.030729 - 4900) / Windows 7 Release Candidate, June 2009
if ((Major >=3) && (Minor >=5) && (Build >= 4506) && (Revision >= 4918))
return @"(NetFXw7.030729 - 4900) / Windows 7 Release Candidate, June 2009 or later";
//3.0.4506.2152 3.0.4506.2152(SP.030729 - 0100) / .NET 4.0 Beta1 / May 2009
if ((Major >= 3) && (Minor >= 5) && (Build >= 4506) && (Revision >= 2152))
return @"3.0.4506.2152(SP.030729 - 0100) / .NET 4.0 Beta1 / May 2009 or later";
//3.0.4506.2123 yes(NetFX.030618 - 0000).NET 3.0 SP2, Aug 2008
if ((Major >= 3) && (Minor >= 5) && (Build >= 4506) && (Revision >= 2123))
return @"s(NetFX.030618 - 0000).NET 3.0 SP2, Aug 2008 or later";
//3.0.4506.2062(SP1Beta1.030428 - 0100), .NET 3.0 SP1 BETA1, May 2008
if ((Major >= 3) && (Minor >= 5) && (Build >= 4506) && (Revision >= 2062))
return @"(SP1Beta1.030428 - 0100), .NET 3.0 SP1 BETA1, May 2008 or later";
//3.0.4506.590(winfxredb2.004506 - 0590), Orcas Beta2, Oct 2007
if ((Major >= 3) && (Minor >= 5) && (Build >= 4506) && (Revision >= 590))
return @"(winfxredb2.004506 - 0590), Orcas Beta2, Oct 2007 or later";
//3.0.4506.577(winfxred.004506 - 0577), Orcas Beta1, Mar 2007
if ((Major >= 3) && (Minor >= 5) && (Build >= 4506) && (Revision >= 577))
return @"(winfxred.004506 - 0577), Orcas Beta1, Mar 2007 or later";
//3.0.4506.30 yes Release (.NET Framework 3.0) Nov 2006
if ((Major >= 3) && (Minor >= 5) && (Build >= 4506) && (Revision >= 30))
return @"Release (.NET Framework 3.0) Nov 2006 or later";
//3.0.4506.25 yes(WAPRTM.004506 - 0026) Vista Ultimate, Jan 2007
if ((Major >= 3) && (Minor >= 5) && (Build >= 4506) && (Revision >= 25))
return @"(WAPRTM.004506 - 0026) Vista Ultimate, Jan 2007 or later";
//2.0.50727.4927 yes(NetFXspW7.050727 - 4900) / Windows 7 Release, Oct 2009
if ((Major >=2) && (Minor >=0) && (Build >= 50727) && (Revision >= 4927))
return @"(NetFXspW7.050727 - 4900) / Windows 7 Release, Oct 2009 or later";
//2.0.50727.4918(NetFXspW7.050727 - 4900) / Windows 7 Release Candidate, June 2009
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 4918))
return @"(NetFXspW7.050727 - 4900) / Windows 7 Release Candidate, June 2009 or later";
//2.0.50727.4200 yes(NetFxQFE.050727 - 4200).NET 2.0 SP2, KB974470, Securityupdate, Oct 2009
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 4200))
return @"(NetFxQFE.050727 - 4200).NET 2.0 SP2, KB974470, Securityupdate, Oct 2009 or later";
//2.0.50727.3603(GDR.050727 - 3600).NET 4.0 Beta 2, Oct 2009
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 3603))
return @"(GDR.050727 - 3600).NET 4.0 Beta 2, Oct 2009 or later";
//2.0.50727.3082 yes(QFE.050727 - 3000), .NET 3.5 Family Update XP / W2003, Dez 2008, KB958481
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 3082))
return @"(QFE.050727 - 3000), .NET 3.5 Family Update XP / W2003, Dez 2008, KB958481 or later";
//2.0.50727.3074 yes(QFE.050727 - 3000), .NET 3.5 Family Update Vista / W2008, Dez 2008, KB958481
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 3074))
return @"(QFE.050727 - 3000), .NET 3.5 Family Update Vista / W2008, Dez 2008, KB958481 or later";
//2.0.50727.3053 yes(netfxsp.050727 - 3000), .NET 2.0 SP2, Aug 2008
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 3053))
return @"yes(netfxsp.050727 - 3000), .NET 2.0 SP2, Aug 2008 or later";
//2.0.50727.3031(netfxsp.050727 - 3000), .NET 2.0 SP2 Beta 1, May 2008
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 3031))
return @"(netfxsp.050727 - 3000), .NET 2.0 SP2 Beta 1, May 2008 or later";
//2.0.50727.1434 yes(REDBITS.050727 - 1400), Windows Server 2008 and Windows Vista SP1, Dez 2007
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 1434))
return @"(REDBITS.050727 - 1400), Windows Server 2008 and Windows Vista SP1, Dez 2007 or later";
//2.0.50727.1433 yes(REDBITS.050727 - 1400), .NET 2.0 SP1 Release, Nov 2007, http://www.microsoft.com/downloads/details.aspx?FamilyID=79bc3b77-e02c-4ad3-aacf-a7633f706ba5
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 1433))
return @"(REDBITS.050727 - 1400), .NET 2.0 SP1 Release, Nov 2007 or later";
//2.0.50727.1378(REDBITSB2.050727 - 1300), Orcas Beta2, Oct 2007
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 1378))
return @"(REDBITSB2.050727 - 1300), Orcas Beta2, Oct 2007 or later";
//2.0.50727.1366(REDBITS.050727 - 1300), Orcas Beta1, Mar 2007
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 1366))
return @"(REDBITS.050727 - 1300), Orcas Beta1, Mar 2007 or later";
//2.0.50727.867 yes(VS Express Edition 2005 SP1), Apr 2007, http://www.microsoft.com/downloads/details.aspx?FamilyId=7B0B0339-613A-46E6-AB4D-080D4D4A8C4E
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 867))
return @"(VS Express Edition 2005 SP1), Apr 2007 or later";
//2.0.50727.832(Fix x86 VC++2005), Apr 2007, http://support.microsoft.com/kb/934586/en-us
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 832))
return @"(Fix x86 VC++2005), Apr 2007 or later";
//2.0.50727.762 yes(VS TeamSuite SP1), http://www.microsoft.com/downloads/details.aspx?FamilyId=BB4A75AB-E2D4-4C96-B39D-37BAF6B5B1DC
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 762))
return @"(VS TeamSuite SP1) or later";
//2.0.50727.312 yes(rtmLHS.050727 - 3100) Vista Ultimate, Jan 2007
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 312))
return @"(rtmLHS.050727 - 3100) Vista Ultimate, Jan 2007 or later";
//2.0.50727.42 yes Release (.NET Framework 2.0) Oct 2005
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 42))
return @"Release (.NET Framework 2.0) Oct 2005 or later";
//2.0.50727.26 Version 2.0(Visual Studio Team System 2005 Release Candidate) Oct 2005
if ((Major >= 2) && (Minor >= 0) && (Build >= 50727) && (Revision >= 26))
return @"Version 2.0(Visual Studio Team System 2005 Release Candidate) Oct 2005 or later";
//2.0.50712 Version 2.0(Visual Studio Team System 2005(Drop3) CTP) July 2005
if ((Major >=2) && (Minor >=0) && (Build >= 50712))
return @"Version 2.0(Visual Studio Team System 2005(Drop3) CTP) July 2005 or later";
//2.0.50215 Version 2.0(WinFX SDK for Indigo / Avalon 2005 CTP) July 2005
if ((Major >=2) && (Minor >=0) && (Build >= 50215))
return @"Version 2.0(WinFX SDK for Indigo / Avalon 2005 CTP) July 2005 or later";
//2.0.50601.0 Version 2.0(Visual Studio.NET 2005 CTP) June 2005
if ((Major >=2) && (Minor >=0) && (Build >= 50601) && (Revision >=0))
return @"Version 2.0(Visual Studio.NET 2005 CTP) June 2005 or later";
//2.0.50215.44 Version 2.0(Visual Studio.NET 2005 Beta 2, Visual Studio Express Beta 2) Apr 2005
if ((Major >=2) && (Minor >=0) && (Build >= 50215) && (Revision >= 44))
return @"Version 2.0(Visual Studio.NET 2005 Beta 2, Visual Studio Express Beta 2) Apr 2005 or later";
//2.0.50110.28 Version 2.0(Visual Studio.NET 2005 CTP, Professional Edition) Feb 2005
if ((Major >=2) && (Minor >=0) && (Build >= 50110) && (Revision >=28))
return @"Version 2.0(Visual Studio.NET 2005 CTP, Professional Edition) Feb 2005 or later";
//2.0.41115.19 Version 2.0(Visual Studio.NET 2005 Beta 1, Team System Refresh) Dec 2004
if ((Major >=2 ) && (Minor >=0 ) && (Build >= 41115) && (Revision >= 19))
return @"Version 2.0(Visual Studio.NET 2005 Beta 1, Team System Refresh) Dec 2004 or later";
//2.0.40903.0 Version 2.0(Whidbey CTP, Visual Studio Express) Oct 2004
if ((Major >=2) && (Minor >=0) && (Build >= 40903) && (Revision >=0))
return @"Version 2.0(Whidbey CTP, Visual Studio Express) Oct 2004 or later";
//2.0.40607.85 Version 2.0(Visual Studio.NET 2005 Beta 1, Team System Refresh) Aug 2004 *
if ((Major >=2) && (Minor >=0) && (Build >= 40607) && (Revision >= 85))
return @"Version 2.0(Visual Studio.NET 2005 Beta 1, Team System Refresh) Aug 2004 * or later";
//2.0.40607.42 Version 2.0(SQL Server Yukon Beta 2) July 2004
if ((Major >=2) && (Minor >=0) && (Build >= 40607) && (Revision >= 42))
return @"Version 2.0(SQL Server Yukon Beta 2) July 2004 or later";
//2.0.40607.16 Version 2.0(Visual Studio.NET 2005 Beta 1, TechEd Europe 2004) June 2004
if ((Major >=2) && (Minor >=0) && (Build >= 40607) && (Revision >= 16))
return @"Version 2.0(Visual Studio.NET 2005 Beta 1, TechEd Europe 2004) June 2004 or later";
//2.0.40301.9 Version 2.0(Whidbey CTP, WinHEC 2004) March 2004 *
if ((Major >=0) && (Minor >=0) && (Build >= 40301) && (Revision >=9))
return @"Version 2.0(Whidbey CTP, WinHEC 2004) March 2004 * or later";
//1.2.30703.27 Version 1.2(Whidbey Alpha, PDC 2004) Nov 2003 *
if ((Major >=1) && (Minor >=2) && (Build >= 30703) && (Revision >= 27))
return @"Version 1.2(Whidbey Alpha, PDC 2004) Nov 2003 * or later";
//1.2.21213.1 Version 1.2(Whidbey pre - Alpha build) *
if ((Major >=1) && (Minor >=2) && (Build >= 21213) && (Revision >=1))
return @"Version 1.2(Whidbey pre - Alpha build) * or later";
//1.1.4322.2443 yes Version 1.1 Servicepack 1, KB953297, Oct 2009
if ((Major >=1) && (Minor >=1) && (Build >= 4322) && (Revision >=2443))
return @"Version 1.1 Servicepack 1, KB953297, Oct 2009 or later";
//1.1.4322.2407 yes Version 1.1 RTM
if ((Major >=1) && (Minor >=1) && (Build >= 4322) && (Revision >= 2407))
return @"Version 1.1 RTM or later";
//1.1.4322.2407 Version 1.1 Orcas Beta2, Oct 2007
if ((Major >=1) && (Minor >=1) && (Build >= 4322) && (Revision >= 2407))
return @"Version 1.1 Orcas Beta2, Oct 2007 or later";
//1.1.4322.2379 Version 1.1 Orcas Beta1, Mar 2007
if ((Major >=1) && (Minor >=1) && (Build >= 4322) && (Revision >= 2379))
return @"Version 1.1 Orcas Beta1, Mar 2007 or later";
//1.1.4322.2032 yes Version 1.1 SP1 Aug 2004
if ((Major >=1) && (Minor >=1) && (Build >= 4322) && (Revision >= 2032))
return @"Version 1.1 SP1 Aug 2004 or later";
//1.1.4322.573 yes Version 1.1 RTM(Visual Studio.NET 2003 / Windows Server 2003) Feb 2003 *
if ((Major >=1) && (Minor >=1) && (Build >= 4322) && (Revision >= 573))
return @"Version 1.1 RTM(Visual Studio.NET 2003 / Windows Server 2003) Feb 2003 * or later";
//1.1.4322.510 Version 1.1 Final Beta Oct 2002 *
if ((Major >=1) && (Minor >=1) && (Build >= 4322) && (Revision >= 510))
return @"Version 1.1 Final Beta Oct 2002 * or later";
//1.0.3705.6018 yes Version 1.0 SP3 Aug 2004
if ((Major >=1) && (Minor >=0) && (Build >= 3705) && (Revision >= 6018))
return @"Version 1.0 SP3 Aug 2004 or later";
//1.0.3705.288 yes Version 1.0 SP2 Aug 2002 *
if ((Major >=1) && (Minor >=0) && (Build >= 3705) && (Revision >= 288))
return @"Version 1.0 SP2 Aug 2002 * or later";
//1.0.3705.209 yes Version 1.0 SP1 Mar 2002 *
if ((Major >=1) && (Minor >=0) && (Build >= 3705) && (Revision >=209))
return @"Version 1.0 SP1 Mar 2002 * or later";
//1.0.3705.0 yes Version 1.0 RTM(Visual Studio.NET 2002) Feb 2002 *
if ((Major >=1) && (Minor >=0) && (Build >= 3705) && (Revision >=0))
return @"Version 1.0 RTM(Visual Studio.NET 2002) Feb 2002 * or later";
//1.0.3512.0 Version 1.0 Pre - release RC3(Visual Studio.NET 2002 RC3)
if ((Major >=1) && (Minor >=0) && (Build >= 3512) && (Revision >=0))
return @"Version 1.0 Pre - release RC3(Visual Studio.NET 2002 RC3) or later";
//1.0.2914.16 Version 1.0 Public Beta 2 Jun 2001 *
if ((Major >=1) && (Minor >=0) && (Build >= 2914) && (Revision >= 16))
return @"Version 1.0 Public Beta 2 Jun 2001 * or later";
//1.0.2204.21 Version 1.0 Public Beta 1 Nov 2000 *
if ((Major >=1) && (Minor >=0) && (Build >= 2204) && (Revision >=21))
return @"Version 1.0 Public Beta 1 Nov 2000 * or later";
return @"Unknown .NET version";
}
}
}
RegistryKey registry_key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full");
if (registry_key == null)
return false;
var val = registry_key.GetValue("Release", 0);
UInt32 Release = Convert.ToUInt32(val);
if (Release >= 394806) // 4.6.2 installed on all other Windows (different than Windows 10)
return true;
if (Release >= 394802) // 4.6.2 installed on Windows 10 or later
return true;
{ int.MinValue, "4.5" },
{ 378389, "4.5" },
{ 378675, "4.5.1" },
{ 378758, "4.5.1" },
{ 379893, "4.5.2" },
{ 381029, "4.6 Preview" },
{ 393273, "4.6 RC1" },
{ 393292, "4.6 RC2" },
{ 393295, "4.6" },
{ 393297, "4.6" },
{ 394254, "4.6.1" },
{ 394271, "4.6.1" },
{ 394747, "4.6.2 Preview" },
{ 394748, "4.6.2 Preview" },
{ 394757, "4.6.2 Preview" },
{ 394802, "4.6.2" },
{ 394806, "4.6.2" },
private static bool Is46Installed()
{
// API changes in 4.6: https://github.com/Microsoft/dotnet/blob/master/releases/net46/dotnet46-api-changes.md
return Type.GetType("System.AppContext, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", false) != null;
}
private static bool Is461Installed()
{
// API changes in 4.6.1: https://github.com/Microsoft/dotnet/blob/master/releases/net461/dotnet461-api-changes.md
return Type.GetType("System.Data.SqlClient.SqlColumnEncryptionCngProvider, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", false) != null;
}
private static bool Is462Installed()
{
// API changes in 4.6.2: https://github.com/Microsoft/dotnet/blob/master/releases/net462/dotnet462-api-changes.md
return Type.GetType("System.Security.Cryptography.AesCng, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", false) != null;
}
private static bool Is47Installed()
{
// API changes in 4.7: https://github.com/Microsoft/dotnet/blob/master/releases/net47/dotnet47-api-changes.md
return Type.GetType("System.Web.Caching.CacheInsertOptions, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", false) != null;
}
private static string GetDotNetVersion()
{
var v4 = (string)Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full", false)?.GetValue("Version");
if(v4 != null)
return v4;
var v35 = (string)Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5", false)?.GetValue("Version");
if(v35 != null)
return v35;
var v3 = (string)Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0", false)?.GetValue("Version");
return v3 ?? "< 3";
}
[STAThread]
static void Main(string[] args)
{
if (!DotNetUtils.IsCompatible())
return;
. . .
}
public class DotNetUtils
{
public enum DotNetRelease
{
NOTFOUND,
NET45,
NET451,
NET452,
NET46,
NET461,
NET462,
NET47,
NET471,
NET472,
NET48,
}
public static bool IsCompatible(DotNetRelease req = DotNetRelease.NET452)
{
DotNetRelease r = GetRelease();
if (r < req)
{
MessageBox.Show(String.Format("This this application requires {0} or greater.", req.ToString()));
return false;
}
return true;
}
public static DotNetRelease GetRelease(int release = default(int))
{
int r = release != default(int) ? release : GetVersion();
if (r >= 528040) return DotNetRelease.NET48;
if (r >= 461808) return DotNetRelease.NET472;
if (r >= 461308) return DotNetRelease.NET471;
if (r >= 460798) return DotNetRelease.NET47;
if (r >= 394802) return DotNetRelease.NET462;
if (r >= 394254) return DotNetRelease.NET461;
if (r >= 393295) return DotNetRelease.NET46;
if (r >= 379893) return DotNetRelease.NET452;
if (r >= 378675) return DotNetRelease.NET451;
if (r >= 378389) return DotNetRelease.NET45;
return DotNetRelease.NOTFOUND;
}
public static int GetVersion()
{
int release = 0;
using (RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)
.OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\"))
{
release = Convert.ToInt32(key.GetValue("Release"));
}
return release;
}
}
public static class DotNetHelper
{
public static Version InstalledVersion
{
get
{
string framework = null;
try
{
using (var ndpKey =
Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\"))
{
if (ndpKey != null)
{
var releaseKey = ndpKey.GetValue("Release");
if (releaseKey != null)
{
framework = CheckFor45PlusVersion(Convert.ToInt32(releaseKey));
}
else
{
string[] versionNames = null;
using (var installedVersions =
Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP"))
{
if (installedVersions != null) versionNames = installedVersions.GetSubKeyNames();
}
try
{
if (versionNames != null && versionNames.Length > 0)
{
framework = versionNames[versionNames.Length - 1].Remove(0, 1);
}
}
catch (FormatException)
{
}
}
}
}
}
catch (SecurityException)
{
}
return framework != null ? new Version(framework) : null;
}
}
private static string CheckFor45PlusVersion(int releaseKey)
{
if (releaseKey >= 460798)
return "4.7";
if (releaseKey >= 394802)
return "4.6.2";
if (releaseKey >= 394254)
return "4.6.1";
if (releaseKey >= 393295)
return "4.6";
if (releaseKey >= 379893)
return "4.5.2";
if (releaseKey >= 378675)
return "4.5.1";
// This code should never execute. A non-null release key should mean
// that 4.5 or later is installed.
return releaseKey >= 378389 ? "4.5" : null;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
namespace MyNamespace
{
public class DotNetVersion
{
protected bool printVerification;
public DotNetVersion(){
this.printVerification=false;
}
public DotNetVersion(bool printVerification){
this.printVerification=printVerification;
}
public string getDotNetVersion(){
string maxDotNetVersion = getVersionFromRegistry();
if(String.Compare(maxDotNetVersion, "4.5") >= 0){
string v45Plus = get45PlusFromRegistry();
if(!string.IsNullOrWhiteSpace(v45Plus)) maxDotNetVersion = v45Plus;
}
log("*** Maximum .NET version number found is: " + maxDotNetVersion + "***");
return maxDotNetVersion;
}
protected string get45PlusFromRegistry(){
String dotNetVersion = "";
const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
using(RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey)){
if(ndpKey != null && ndpKey.GetValue("Release") != null){
dotNetVersion = checkFor45PlusVersion((int)ndpKey.GetValue("Release"));
log(".NET Framework Version: " + dotNetVersion);
}else{
log(".NET Framework Version 4.5 or later is not detected.");
}
}
return dotNetVersion;
}
// Checking the version using >= will enable forward compatibility.
protected string checkFor45PlusVersion(int releaseKey){
if(releaseKey >= 461308) return "4.7.1 or later";
if(releaseKey >= 460798) return "4.7";
if(releaseKey >= 394802) return "4.6.2";
if(releaseKey >= 394254) return "4.6.1";
if(releaseKey >= 393295) return "4.6";
if((releaseKey >= 379893)) return "4.5.2";
if((releaseKey >= 378675)) return "4.5.1";
if((releaseKey >= 378389)) return "4.5";
// This code should never execute. A non-null release key should mean
// that 4.5 or later is installed.
log("No 4.5 or later version detected");
return "";
}
protected string getVersionFromRegistry(){
String maxDotNetVersion = "";
// 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\"))
string[] subKeyNnames = ndpKey.GetSubKeyNames();
foreach(string versionKeyName in subKeyNnames){
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(string.IsNullOrWhiteSpace(install)){ //no install info, must be later.
log(versionKeyName + " " + name);
if(String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}else{
if(!string.IsNullOrWhiteSpace(sp) && "1".Equals(install)){
log(versionKeyName + " " + name + " SP" + sp);
if(String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
}
if(!string.IsNullOrWhiteSpace(name)){
continue;
}
string[] subKeyNames = versionKey.GetSubKeyNames();
foreach(string subKeyName in subKeyNames){
RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
name =(string)subKey.GetValue("Version", "");
if(!string.IsNullOrWhiteSpace(name)){
sp = subKey.GetValue("SP", "").ToString();
}
install = subKey.GetValue("Install", "").ToString();
if(string.IsNullOrWhiteSpace(install)){
//no install info, must be later.
log(versionKeyName + " " + name);
if(String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}else{
if(!string.IsNullOrWhiteSpace(sp) && "1".Equals(install)){
log(" " + subKeyName + " " + name + " SP" + sp);
if(String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
else if("1".Equals(install)){
log(" " + subKeyName + " " + name);
if(String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
} // if
} // if
} // for
} // if
} // foreach
} // using
return maxDotNetVersion;
}
protected void log(string message){
if(printVerification) Console.WriteLine(message);
}
} // class
}
var version = NetFrameworkUtilities.GetVersion();
if (version != null && version < new Version(4, 5))
{
MessageBox.Show("Your .NET Framework version is less than 4.5");
}
using System;
using System.Linq;
using Microsoft.Win32;
namespace Utilities
{
public static class NetFrameworkUtilities
{
public static Version GetVersion() => GetVersionHigher4() ?? GetVersionLowerOr4();
private static Version GetVersionLowerOr4()
{
using (var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP"))
{
var names = key?.GetSubKeyNames();
//version names start with 'v', eg, 'v3.5' which needs to be trimmed off before conversion
var text = names?.LastOrDefault()?.Remove(0, 1);
if (string.IsNullOrEmpty(text))
{
return null;
}
return text.Contains('.')
? new Version(text)
: new Version(Convert.ToInt32(text), 0);
}
}
private static Version GetVersionHigher4()
{
using (var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"))
{
var value = key?.GetValue("Release");
if (value == null)
{
return null;
}
// 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.
var releaseKey = Convert.ToInt32(value);
if (releaseKey >= 461308) return new Version(4, 7, 1);
if (releaseKey >= 460798) return new Version(4, 7);
if (releaseKey >= 394747) return new Version(4, 6, 2);
if (releaseKey >= 394254) return new Version(4, 6, 1);
if (releaseKey >= 381029) return new Version(4, 6);
if (releaseKey >= 379893) return new Version(4, 5, 2);
if (releaseKey >= 378675) return new Version(4, 5, 1);
if (releaseKey >= 378389) return new Version(4, 5);
// This line should never execute. A non-null release key should mean
// that 4.5 or later is installed.
return new Version(4, 5);
}
}
}
}
var frameworkName = new System.Runtime.Versioning.FrameworkName(
AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName
);
if (frameworkName.Version >= new Version(4, 5))
{
// run code
}
using Microsoft.Win32;
using System.Runtime.InteropServices;
namespace System.Runtime.InteropServices {
public static class RuntimeInformationEx {
public static Version? GetDotnetFrameworkVersion() {
using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full");
if (key is object) {
if (!Int32.TryParse(key.GetValue("Release", "").ToString(), out var release)) return null;
return release switch
{
378389 => new Version(4, 5, 0),
378675 => new Version(4, 5, 1),
378758 => new Version(4, 5, 1),
379893 => new Version(4, 5, 2),
393295 => new Version(4, 6, 0),
393297 => new Version(4, 6, 0),
394254 => new Version(4, 6, 1),
394271 => new Version(4, 6, 1),
394802 => new Version(4, 6, 2),
394806 => new Version(4, 6, 2),
460798 => new Version(4, 7, 0),
460805 => new Version(4, 7, 0),
461308 => new Version(4, 7, 1),
461310 => new Version(4, 7, 1),
461808 => new Version(4, 7, 2),
461814 => new Version(4, 7, 2),
528040 => new Version(4, 8, 0),
528209 => new Version(4, 8, 0),
528049 => new Version(4, 8, 0),
_ => null
};
} else { // .NET version < 4.5
using var key1 = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP");
if (key1 is null) return null;
var parts = key1.GetSubKeyNames()[^1].Substring(1).Split('.'); // get lastsub key, remove 'v' prefix, and split
if (parts.Length == 2) parts = new string[] { parts[0], parts[1], "0" };
if (parts.Length != 3) return null;
Func<string, int> Parse = s => Int32.TryParse(s, out var i) ? i : -1;
try { return new Version(Parse(parts[0]), Parse(parts[1]), Parse(parts[2])); } catch { return null; }
}
}
public static Version? GetDotnetCoreVersion() {
if (!RuntimeInformation.FrameworkDescription.StartsWith(".NET Core ")) return null;
var parts = RuntimeInformation.FrameworkDescription.Substring(10).Split('.');
if (parts.Length == 2) parts = new string[] { parts[0], parts[1], "0" };
if (parts.Length != 3) return null;
Func<string, int> Parse = s => Int32.TryParse(s, out var i) ? i : -1;
try { return new Version(Parse(parts[0]), Parse(parts[1]), Parse(parts[2])); } catch { return null; }
}
}
}
string version = (typeof(string).Assembly
.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), false)
.FirstOrDefault() as AssemblyFileVersionAttribute)?.Version;
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework
4.0 = 4.0.30319.1
4.5 = 4.0.30319.18020
4.5.1 = 4.0.30319.18402
4.5.2 = 4.0.30319.34211
4.6 = 4.6.81.0
4.6.1 = 4.6.1055.0
4.7.2 = 4.7.3062.0
4.8 = 4.8.3761.0