程序集加载器:查找程序集,找到将程序集装载到调用者的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)
程序集下载者(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)