有人问了here个类似的问题,但这是针对特定人群的.净3.5.具体来说,我正在寻找以下信息:

  1. 确定安装了哪些.NET Framework版本和Service Pack的正确方式是什么?
  2. 是否有可以使用的注册表项列表?
  3. 框架版本之间是否存在依赖关系?

推荐答案

注册表为the official way,用于检测是否安装了特定版本的框架.

在此处输入图像描述

需要更改哪些注册表项取决于您正在寻找的框架版本:

Framework Version  Registry Key
------------------------------------------------------------------------------------------
1.0                HKLM\Software\Microsoft\.NETFramework\Policy\v1.0\3705 
1.1                HKLM\Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\Install 
2.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\Install 
3.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\InstallSuccess 
3.5                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5\Install 
4.0 Client Profile HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Client\Install
4.0 Full Profile   HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full\Install

一般来说,你正在寻找:

"Install"=dword:00000001

除了.NET 1.0,其中值是字符串(REG_SZ)而不是数字(REG_DWORD).

确定service pack级别遵循类似的模式:

Framework Version  Registry Key
------------------------------------------------------------------------------------------
1.0                HKLM\Software\Microsoft\Active Setup\Installed Components\{78705f0d-e8db-4b2d-8193-982bdda15ecd}\Version 
1.0[1]             HKLM\Software\Microsoft\Active Setup\Installed Components\{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}\Version 
1.1                HKLM\Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\SP 
2.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\SP 
3.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.0\SP 
3.5                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5\SP 
4.0 Client Profile HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Client\Servicing
4.0 Full Profile   HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full\Servicing

[1] Windows Media Center or Windows XP Tablet Edition

如您所见,确定的SP级别.如果您在Windows Media Center或Windows XP Tablet Edition上运行,NET 1.0将发生更改.再一次NET 1.0使用字符串值,而其他所有使用DWORD.

对于NET 1.0这些键的字符串值的格式为#、#、#、##、#.最后是服务包级别.

虽然我没有明确要求,但如果您想知道框架的确切版本号,可以使用以下注册表项:

Framework Version  Registry Key
------------------------------------------------------------------------------------------
1.0                HKLM\Software\Microsoft\Active Setup\Installed Components\{78705f0d-e8db-4b2d-8193-982bdda15ecd}\Version 
1.0[1]             HKLM\Software\Microsoft\Active Setup\Installed Components\{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}\Version 
1.1                HKLM\Software\Microsoft\NET Framework Setup\NDP\v1.1.4322 
2.0[2]             HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\Version 
2.0[3]             HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\Increment
3.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.0\Version 
3.5                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5\Version 
4.0 Client Profile HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Version 
4.0 Full Profile   HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Version 

[1] Windows Media Center or Windows XP Tablet Edition
[2] .NET 2.0 SP1
[3] .NET 2.0 Original Release (RTM)

再一次NET 1.0使用字符串值,而其他所有使用DWORD.

附加说明

  • 对于NET 1.0这些键的字符串值的格式为#,#,####,#.字符串的#,#,####部分是框架版本.

  • 对于NET 1.1中,我们使用注册表项本身的名称,它表示版本号.

  • 最后,如果您看一下依赖项,.NET 3.0向.NET 2.0添加了额外的功能,因此.NET 2.0和.NET 3.0都必须判断为已安装,才能正确地表明.NET 3.0已安装.同样,.NET 3.5向.NET 2.0和.NET 3.0添加了附加功能,因此.NET 2.0、.NET 3.0和.NET 3都应该判断为已安装,才能正确说明已安装.NET 3.5.

  • .NET 4.0安装了新版本的CLR(CLR 4.0版),可以与CLR 2.0并排运行.

.NET 4.5更新

如果出现以下情况,注册表中将不会有v4.5项.NET 4.5已安装.相反,您必须判断HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full键是否包含名为Release的值.如果该值存在.NET 4.5已安装,否则不安装.更多详情请参见herehere.

.net相关问答推荐

尽管有`disable`注释,但未 suppress Pylint语法错误

如何将多个安装程序Bundle 到一个安装程序中?

cmd 冻结中的 dotnet 命令.怎么了?

使用 MassTransit、.NET Core 和 RabbitMQ 的设计挑战

Erlang 的让它崩溃的哲学 - 适用于其他地方吗?

将客户端证书添加到 .NET Core HttpClient

我可以使用 UriTemplate 将非字符串传递给 WCF RESTful 服务吗?

.NET 世界是否有 Maven 替代方案或端口?

XmlNode 值与内部文本

将 Topshelf 应用程序安装为 Windows 服务

什么是编组?当某些东西被编组时会发生什么?

如何将 UI Dispatcher 传递给 ViewModel

您可以在 C# 代码中捕获本机异常吗?

公钥令牌的作用是什么?

何时何地使用 GetType() 或 typeof()?

使用 DateTime.ToString() 时获取日期后缀

为什么 .NET 中没有 Tree 类?

IronPython 与 Python .NET

如果选中,则更改列表框项的 WPF DataTemplate

如何判断uri字符串是否有效