使用过COM来访问.NET组件的朋友们应该都会注意到在对应注册表中有一个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的限制,很有可能RuntimeVersion的行为也会作出相应改变,但是目前还有一些细节没有敲定,等有了进一步消息我会尽快更新。
分享到:
相关推荐
### 优秀 ASP.NET 及 WinForm 开发人员所需掌握的核心知识点 ...通过掌握以上知识点,一个 ASP.NET 或 WinForm 开发人员不仅能够熟练地拖放控件,还能够在复杂的项目中发挥更大的作用,成为一名真正的专家级开发者。
此框架的核心组件包括Common Language Runtime (CLR)、Base Class Libraries (BCL)以及用于图形、数据库、网络等各种功能的类库。C#作为.NET的主要编程语言,通过.NET Framework 4.8获得了更多新特性和性能优化,...
当我们在Windows操作系统上安装.NET Framework 2.0时,系统会自动执行一系列步骤,包括注册相关组件到注册表中,以便操作系统和应用程序能够识别并使用这些组件。 注册表是Windows系统中的一个重要数据库,存储着...
4. **注册表问题**:系统注册表中的某些条目可能已损坏或丢失,导致安装程序无法识别已安装的组件。 #### 解决方案 1. **使用 Windows Update 更新系统**: - 打开“控制面板” > “Windows Update”,检查并安装...
3. **清理注册表**:卸载完上述组件后,还需要清理注册表中的相关信息。注意,在修改注册表之前一定要备份当前的注册表快照,并确认自己熟悉如何操作。可以搜索与Visual Studio 2005相关的键值并删除它们,包括但不...
在C#或VB.NET等.NET语言中,可以使用`System.Runtime.InteropServices`命名空间中的特性来声明对COM组件的引用。对于`Interop.IWshRuntimeLibrary.dll`,我们需要添加一个引用,然后导入`IWshRuntimeLibrary`命名...
1. **安装过程中提示Microsoft Document Explorer 2008安装失败**:这是一个与文档管理相关的组件。 2. **安装Visual C++ 9.0 Runtime (x86)失败**:这是Visual Studio 2008的一个重要组成部分,用于支持运行时环境...
这可能涉及到具体的COM组件问题、权限问题、注册表问题或者环境配置问题等。因此,在临时解决加载问题后,建议开发者仔细排查并解决这些潜在问题,以避免在项目开发的其他阶段遇到类似的异常。 此外,由于内容中...
对于ADB,可以在CMD中输入`adb version`来验证是否已正确配置。如果显示ADB的版本号,即表明配置成功。 通过以上步骤,用户可以准备就绪,开始使用APK Multi-Tool进行APK的反编译和修改工作。这个工具对于理解APK...