技术开发 频道

.NET中的幕后英雄:MSCOREE.DLL


对于COM来说,COM只知道CLSID=0029598F-26Fa-46F7-953B-86E2947AB19F}的COM对象位于MSCOREE.DLL中。而事实上,这个类型位于Microsoft.SqlServer.Replication.dll之中,但是COM并不知道,COM只需要知道从MSCOREE.DLL中可以获得对应的ClassFactory就可以了,然后COM会通过IClassFactory接口创建这个托管对象的实例,并返回对应的接口。假定一个非托管程序尝试通过COM创建这样一个对象,那么会发生下面这些事情:

<!--[if !supportLists]-->1.     <!--[endif]-->程序调用CoCreateInstance通知COM需要创建这样一个对象,CLSID=0029598F-26Fa-46F7-953B-86E2947AB19F,需要返回IDispatch接口
<!--[if !supportLists]-->2.     <!--[endif]-->COM调用CoGetClassObject函数查找对应的入口DLL
<!--[if !supportLists]-->3.     <!--[endif]-->COM找到对应的注册表,发现对应的DLL为MSCOREE.DLL
<!--[if !supportLists]-->4.     <!--[endif]-->COM加载MSCOREE.DLL,调用DllGetClassObject函数,传入CLSID
<!--[if !supportLists]-->5.     <!--[endif]-->MSCOREE.DLL中的DllGetClassObject函数读入CLSID,找到对应的注册表,获取对象的类型名称,Assembly名称,CLR版本等信息
<!--[if !supportLists]-->6.     <!--[endif]-->DllGetClassObject加载对应版本的CLR
<!--[if !supportLists]-->7.     <!--[endif]-->DllGetClassObject返回一个临时Class Factory对象的IClassFactory接口
<!--[if !supportLists]-->8.     <!--[endif]-->COM调用这个Class Factory对象的IClassFactory::CreateInstance方法
<!--[if !supportLists]-->9.     <!--[endif]-->这个Class Factory加载对应的CLR,并创建对象,返回一个对象的CCW (Com Callable Wrapper),并该CCW的返回指定的IDispatch接口
可以看到,这个情况下起到最关键作用的是MSCOREE.DLL所提供的DllGetClassObject函数。

除了对用户自定义的托管对象提供COM支持之外,MSCOREE.DLL自己也支持少量COM对象,因此MSCOREE.dll支持DllGetClassObject, DllRegisterServer, DllUnregisterServer, DllCanUnloadNow这些COM DLL所需要支持的标准函数。

MSCOREE.DLL的兼容性问题

我们可以考虑一下,假如我们现在有了.NET Framework 1.0,然后安装了.NET Framework 2.0,那么MSCOREE.DLL会发生变化吗。答案是可能会,如果到2.0到1.0发生了改变需要修改MSCOREE.DLL(比如多加了一个函数),那么肯定要更新MSCOREE.DLL,但是这个MSCOREE.DLL必须完全支持所有.NET Framework 1.0中的MSCOREE.DLL中的函数,否则可以想象所有依赖于这些变化的MSCOREE.DLL中的函数程序都会出错。因此MSCOREE.DLL必须要做到完全向前兼容。

再考虑卸载的情况,假如这个时候.NET Framework 2.0被卸载,那么MSCOREE.DLL会被还原成.NET Framework 1.0的吗?这次答案则是不会。因为2.0的MSCOREE.DLL本身支持.NET Framework 1.0,因此无须替换。这样最为简单。

事实上是,CLR Team一般很少改动MSCOREE.DLL,避免出现兼容性问题,因此可以预见,MSCOREE.DLL将会是.NET Framework/CLR中变化最少的DLL。换句话说,这篇文章的内容,在可以预见的未来几个版本基本上不会过时。OK,对于MSCOREE.DLL的讨论到这里就告一段落,有兴趣的朋友可以自己动手写一些小程序,实际体会一下MSCOREE.DLL所提供的各项功能。

查看原文

0
相关文章