tonyqus.cn

新blog: http://tonyqus.wordpress.com.cn/
随笔 - 202, 文章 - 1, 评论 - 1226, 引用 - 57
数据加载中……

如何检测是否安装了.NET 2.0和.NET 3.0

代码来自Paint.NET的PaintDotNet.SystemLayer.OS类

这段代码是通过检查注册表中的项来确定.NET 2.0/3.0是否安装的。由于Paint.NET是由微软员工参与开发的,可以认为这是比较准确的判断方法。大家借鉴一下检测方法就可以了,不用太在意实现,在C++中这种检测方法同样可以实现。

        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);
            }

        }

posted on 2007-10-07 17:22 Tony Qu 阅读(981) 评论(6)  编辑 收藏 所属分类: .NET 2.0 技术

评论

#1楼    回复  引用  查看    

假如电脑上没有安装.NET2.0那上面的代码就没有办法运行,假如已经安装了,这段代码就可以运行,就没必要检测。好像达不到要求啊?
2007-10-07 19:27 | 穿石水滴      

#2楼    回复  引用  查看    

VS 2005 只用定制这些就可以做到...
2007-10-08 09:15 | winzheng      

#3楼    回复  引用  查看    

思路是这样的,将代码改造成win32就没有上几楼说的问题了
2007-10-09 20:49 | jillzhang      

#4楼    回复  引用  查看    

不错,明天我写成C++
2007-11-02 21:20 | 秋忆      

#5楼    回复  引用  查看    

这是我改写成VC++的,有需要的朋友可以看看:http://www.skymean.com/blog/post/265.html
2007-11-03 19:35 | 秋忆      

#6楼    回复  引用    

我想应该还有更好的方法,比如某个静态属性
2008-04-07 10:27 | apoclast [未注册用户]

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-10-08 06:59 编辑过


相关链接: