Posted on 2006-12-16 23:24
Riceball LEE 阅读(1392)
评论(2) 编辑 收藏 网摘 所属分类:
Inside Rotor
程序集加载器:查找程序集,找到将程序集装载到调用者的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)
Inside the Rotor CLI
4.2 Loading the Assembly
The downloader part of the assembly loader first looks for the target assembly in the GAC, then in application directory and its subdirectories.