,待会再详细讨论。 BaseDomain::Init 函数(vmappdomain.cpp:310)除了要负责初始化 BaseDomain 对象的一大堆成员变量外,主要负担堆和缓存的初始化。CLR 中的堆,实际上是在每个 AppDomain 中存在的,这也是为什么我们刚刚可以使用 EEHeap 命令列举 AppDomain 的原因。在初始化 BaseDomain 之后,会将 SystemDomain 的接口 VTable 映射表设置为共享,这是因为 SystemDomain 负责载入的 mscorlib 中类型实际上是所以 AppDomain 中都需要使用到的。 接着 SystemDomain::Attach 会调用 SystemDomain::CreateDefaultDomain 函数(vmappdomain.cpp:2522)构造缺省的 AppDomain,也就是前面试验中的 "Domain 0",用作载入用户指定 Assembly 执行。此函数只是简单地调用 SystemDomain::NewDomain 函数以非 Managed 方式构造新的 AppDomain 实例;然后将此 AppDomain 设置为缺省的 AppDomain。 以下内容为程序代码: HRESULT SystemDomain::CreateDefaultDomain() { HRESULT hr = S_OK; // 防止多次初始化 if (m_pDefaultDomain != NULL) return S_OK; // 以非 Managed 方式构造新的 AppDomain 实例 AppDomain* pDomain = NULL; i页码:[1] [2] [3] [4] [5] [6] [7] [8] [9] 第8页、共9页 |