代碼來自Paint.NET的PaintDotNet.SystemLayer.OS類
這段代碼是通過檢查註冊表中的項來確定.NET 2.0/3.0是否安裝的。由於Paint.NET是由微軟員工參與開發的,可以認為這是比較準確的判斷方法。
private static bool IsDotNet2VersionInstalled(int major, int minor, int build)
{
const string regKeyNameFormat = "Software\\Microsoft\\NET Framework Setup\\NDP\\v{0}.{1}.{2}";
const string regValueName = "Install";
string regKeyName = string.Format(regKeyNameFormat, major.ToString(CultureInfo.InvariantCulture),
minor.ToString(CultureInfo.InvariantCulture), build.ToString(CultureInfo.InvariantCulture));
return CheckForRegValueEquals1(regValueName, regKeyName);
}
private static bool IsDotNet3VersionInstalled(int major, int minor, int build)
{
bool result = false;
const string regValueName = "InstallSuccess";
if (!result)
{
const string regKeyNameFormat = "Software\\Microsoft\\NET Framework Setup\\NDP\\v{0}.{1}\\Setup";
string regKeyName = string.Format(regKeyNameFormat, major, minor);
result |= CheckForRegValueEquals1(regKeyName, regValueName);
}
if (!result)
{
// There seems to be a bug in x64 .NET 3.0 where it only records its success in the 32-bit section of the registry.
const string regKeyNameFormat2 = "Software\\Wow6432Node\\Microsoft\\NET Framework Setup\\NDP\\v{0}.{1}\\Setup";
string regKeyName2 = string.Format(regKeyNameFormat2, major, minor);
result |= CheckForRegValueEquals1(regKeyName2, regValueName);
}
return result;
}
private static bool CheckForRegValueEquals1(string regKeyName, string regValueName)
{
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(regKeyName, false))
{
object value = null;
if (key != null)
{
value = key.GetValue(regValueName);
}
return (value != null && value is int && (int)value == 1);
}
}