好
现在我们知道了ISAPIRuntime对象是托管代码的入口点
那么这个对象是什么时候产生的呢?换句话说
w
wp也是一个非瀀?潳楬?托管代码写出的程序
它是在什么时候把
net运行时加载进来的呢?(如果好奇心再强一点
还可以问一问一个工作进程是什么时刻产生并开始运行的
它和应用程序池有着怎样的交互
)完全解释清楚这些问题已经超过了笔者目前的能力范围
还望高人补充或提供资料线索
但目前我们从
net的代码中应该可以推断出
ISAPIRuntime对象和应用程序域是对应的
net在创建应用程序域的时候
就会创建ISAPIRuntime对象
见下面的创建应用程序域的代码
创建应用程序域
/**//*这是SystemWebHostingAppDomainFactory类型的Create方法它调用的是实际工厂的Create方法*/
[return: MarshalAs(UnmanagedTypeInterface)]
public object Create(string module string typeName string appId string appPath string strUrlOfAppOrigin int iZone)
{
/**//*实际工厂是一个AppManagerAppDomainFactory类型的对象*/
return this_realFactoryCreate(appId appPath);
}
/**//*AppManagerAppDomainFactoryCreate方法请看代码内的注释*/
[return: MarshalAs(UnmanagedTypeInterface)]
public object Create(string appId string appPath)
{
object obj;
try
{
if (appPath[] == )
{
FileInfo info = new FileInfo(appPath);
appPath = infoFullName;
}
if (!StringUtilStringEndsWith(appPath \\))
{
appPath = appPath + @\;
}
ISAPIApplicationHost appHost = new ISAPIApplicationHost(appId appPath false);
/**//*这个方法内部的调用链非常复杂它一方面创建了一个应用程序域一方面返回一个ISAPIRuntime对象具体这个方法究竟是如何创建AppDomain对象的大家可以用
JetBrain来跟蹤其调用栈关于这部分内容更详尽的信息可参见ASPNET Internals The bridge between ISAPI and Application Domains一文
另外如果您使用JetBrain来调试系统程序集的话有可能会因为缺少相应pdb文件而不能查看完整调试信息这里提供一个根据已有程序集先反汇编成中间码
再重新以调试模式生成dll和pdb文件的方法
)生成IL文件: ildasm /tok /byt systemwebdll /out=systemwebil
)重新生成PDB/DLL: ilasm systemwebil /DEBUG /DLL /OUTPUT=SystemWebdll*/
ISAPIRuntime o = (ISAPIRuntime) this_appManagerCreateObjectInternal(appId typeof(ISAPIRuntime) appHost false null);
oSetThisAppDomainsIsapiAppId(appId);
oStartProcessing();
obj = new ObjectHandle(o);
}
catch (Exception)
{
throw;
}
return obj;
}
写在前面的话网上讲Aspnet运行模式的好文章已经很多了笔者本不用多此一举另成一文但从笔者自己的学习经验看如果学到的这些知识不能对应到类库中的源代码印象总归不够深刻大有隔靴搔痒之感只好自己写上一篇对这方面的知识做个小小的总结文中所有内容都是笔者在看了网上很多文章后结合自己的开发经验得出的一些理解难免有错误的地方欢迎批评指出另外由于笔者能力所限很多地方并未说透(真正对应到代码)也盼高手能够给予补充
[] [] [] []