俺的回收站

架构分析 解释编译原理
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

程序集的加载和执行

Posted on 2006-12-16 23:24  Riceball LEE  阅读(1714)  评论(2编辑  收藏  举报
程序集加载器:查找程序集,找到将程序集装载到调用者的AppDomain中,在装载前加载器将使用Policy Manager校验相应的安全权限,确保调用者被允许使用该程序集。
程序集下载者(downloader)是程序集加载器的一部分,用于查找程序集,并将其下载到本地(如果程序集不在本地),以便装载,开发者可以在配置文件中指定附加的
下载位置,配置文件必须和应用程序在同一目录,并遵循如下的命名,在程序集文件名后附加扩展名“.config”,如: xxx.exe.config。源程序的位置在:/clr/src/fusion。
目录的查找顺序:
  GAC目录(如果是StrongName Assembly)
  应用目录
  应用子目录
  配置文件中的附加位置

程序集找到后,下载器将程序集流(文件名)传递给加载器,加载器使用Policy Manager校验相应的安全权限,确保程序集能在该环境下运行以及用户有执行该程序集的许可。
然后,继续fusion,将程序集加载到AppDomain,并调用类加载器(class loader)。

  nExitCode = _CorExeMain2(NULL, 0, pFileName, NULL, pCmdLine);                       //clr\src\tools\clix\clix.cpp:
    result = CoInitializeEE(COINITEE_DEFAULT | COINITEE_MAIN);  //初始化虚拟执行引擎  //clr\src\vm\ceemain.cpp:
    bRetVal = ExecuteEXE(pImageNameIn);
          SystemDomain::ExecuteMainMethod(hMod);    //clr\src\vm\assembly.cpp
          hr = ClassLoader::RunMain(pMeth, 1, &iRetVal, stringArgs); //clr\src\vm\clsload.cpp
          然后弄了一个线程,在线程里运行
             ARG_SLOT stackVar = ObjToArgSlot(StrArgArray); //在这里才装入?
  分析clix感觉不对,Policy Manager以及downloader都没有看到!

=== 类加载器 ===
当类准备执行的时候类加载器就会被调用。这发生在:
  1、程序集的主入口点被加载
  2、正在执行的对象引用了一个从未加载的对象。
类加载器将从程序集中加载该类的全部定义,然后准备相应的对象实例化:
  复制IL以及该类的MetaData
  准备类的数据结构(EEClass)
  创建初始化类的的方法表(MethodTable and Vtable)