Welcome

首页 / 软件开发 / .NET编程技术 / CLR寄宿(上) MSCOREE.DLL

CLR寄宿(上) MSCOREE.DLL2014-06-15托管代码调用非托管代码,.NET提供了P/Invoke(平台调用)方式,它作为.NET的基础出现在各类书籍和网络资源上,这里不再讨论。那么非托管代码如何去调用托管代码呢?我们知道,一个托管应用程序首先被操作系统启动,然后由操作系统调用CLR来托管该程序。那么.NET框架到底以什么方式让操作系统来认识它并且可以启动它呢?微软实际将其作为COM服务器实现在一个DLL中,并提供了标准的COM接口。既然是COM服务,也就意味着普通的非托管程序也可以调用CLR来运行托管代码,把这种调用方式叫做寄宿,把调用CLR的非托管程序叫做宿主。宿主程序不仅可以调用CLR,还可以通过它来进行内存管理、垃圾回收管理、策略管理、事件管理以及线程控制等高级管理。
1.1  核心组件MSCOREE.DLL

MSCOREE.DLL负责选择.NET版本、调用和初始化CLR等工作。非托管程序想要启动CLR也必须引用MSCOREE.DLL,利用它的导出函数加载托管代码和进行定制CLR等操作。既然现在的焦点集中在MSCOREE.DLL,下面一同来看它的庐山真面目。
查看MSCOREE.DLL的头文件

   对于MSCOREE.DLL文件,我们没有办法查看它的源代码,但是FrameWork SDK提供了mscoree.h文件,可以到相关版本的SDK安装目录中查看该文件。由于该文件很大,这里就不贴出源代码进行分析了。接下来会对相关的接口和函数做介绍。
MSCOREE.DLL的导出函数

   在命令行启动DumpBin.exe,执行以下代码查看MSCOREE.DLL的导出函数列表:

C:Windowsystem32>dumpbin /exports MSCOREE.DLL

结果如图1-3所示。

图1-3  输出MSCOREE.DLL的导出函数列表

从运行的结果可以知道,MSCOREE.DLL中的导出函数有100多个,所有这些函数都可以被公开调用,而且在MSDN上可以找到每个函数的解释。这里只介绍其中几个常用的函数。

CorBindToRuntimeEx函数

该函数由宿主调用来加载CLR,该函数的定义如代码清单1-4所示。

代码清单1-4 CorBindToRuntimeEx函数定义

HRESULT CorBindToRuntimeEx (

   [in]  LPWSTR    pwszVersion,

   [in]  LPWSTR    pwszBuildFlavor,

   [in]  DWORD     startupFlags,

   [in]  REFCLSID  rclsid,

   [in]  REFIID    riid,

   [out] LPVOID*   ppv

);