.NET组件的注册表中RuntimeVersion的作用

开发 后端
.NET组件在对应注册表中有一个RuntimeVersion的键值,本文向您讲解RuntimeVersion的作用。

使用过COM来访问.NET组件的朋友们应该都会注意到在对应注册表中有一个RuntimeVersion的键值:

RuntimeVersion的键值

这个RuntimeVersion的命名很容易让人误认为RuntimeVersion是用来指定该.NET组件所应该运行的CLR的版本号。实际上,这个键值的意思和字面上不是特别一致。如果我们考虑一个情况:首先,进程中先创建一个.NET类型的实例,RuntimeVersion标记为1.1,然后再创建一个.NET类型的实例,其RuntimeVersion标记为v2.0,那么到底会加载那些CLR版本呢?其实,在目前的.NET版本(Silverlight除外)中,因为无法支持在同一个进程中加载多个不同版本的CLR,因此无法支持真正的按照RuntimeVersion来加载不同的CLR版本。实际上,CLR总是加载***的CLR版本(严格来说其实是mscoree.dll来加载)。因此,在之前的情况下,如果机器上面安装了1.1和2.0,实际上进程只加载了2.0的CLR,而没有加载1.1。如果机器上面只有1.1的话,***个1.1的.NET组件会创建成功,并且启动1.1的CLR,第二个2.0的.NET类型会创建失败,并且返回REGDB_E_CLASSNOTREG (0x80040154)

总结一下:通过COM的CoCreateInstance创建.NET类型的实例的时候,CLR总是加载***的CLR版本,如果启动成功,检查该CLR版本是否大于或等于RuntimeVersion键值。如果是,成功,返回S_OK,否则失败,返回REGDB_E_CLASSNOTREG。因此,如果在CoCreateInstance的时候发现返回REGDB_E_CLASSNOTREG,但是注册表又没有问题的话,不妨检查一下RuntimeVersion。

顺便说一句,在.NET 4.0中,我们正在着手去掉进程内无法加载多个不同版本CLR的限制,很有可能.NET组件中RuntimeVersion的行为也会作出相应改变,但是目前还有一些细节没有敲定,等有了进一步消息我会尽快更新。

 

【编辑推荐】

  1. 使用C#轻松编写.Net组件
  2. .NET组件中的线程辅助
  3. .NET组件和COM组件之间的相互操作
  4. C#和VB.NET类型相关知识汇总
  5. ASP.NET多附件上传和附件编辑的实现
责任编辑:佚名 来源: CSDN博客
相关推荐

2009-05-28 14:11:05

Windows Emb

2009-07-07 12:09:04

注册表开发.NET Compac

2009-10-12 16:08:14

VB.NET访问注册表

2009-10-16 09:40:54

VB.NET访问注册表

2010-01-11 18:40:03

VB.NET操作注册表

2011-08-04 16:37:09

注册表编辑器注册表

2009-07-16 15:13:17

Windows Emb

2010-01-08 10:09:50

VB.NET注册表操作

2009-11-10 17:31:38

VB.NET注册表

2011-08-04 16:49:33

注册表注册表编辑器

2009-10-26 14:50:18

VB.NET遍历注册表

2009-10-26 13:46:31

VB.NET注册表权限

2010-01-18 13:57:38

VB.NET读写注册表

2010-10-20 17:14:03

SQL Server管

2009-08-31 14:45:13

C#注册表

2009-02-18 08:42:40

手动备份注册表

2020-09-29 09:26:36

Nexus

2011-08-04 18:49:50

注册表注册表编辑器

2009-08-21 09:43:49

C#编辑注册表

2009-08-19 14:34:26

C#中操作注册表
点赞
收藏

51CTO技术栈公众号