asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

从.NET类库代码来看ASP.NET运行时[2]


发布日期:2024年02月13日
 
从.NET类库代码来看ASP.NET运行时[2]
现在我们知道了ISAPIRuntime对象是托管代码的入口点那么这个对象是什么时候产生的呢?换句话说wwp也是一个非瀀?潳楬?托管代码写出的程序它是在什么时候把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运行模式的好文章已经很多了笔者本不用多此一举另成一文但从笔者自己的学习经验看如果学到的这些知识不能对应到类库中的源代码印象总归不够深刻大有隔靴搔痒之感只好自己写上一篇对这方面的知识做个小小的总结文中所有内容都是笔者在看了网上很多文章后结合自己的开发经验得出的一些理解难免有错误的地方欢迎批评指出另外由于笔者能力所限很多地方并未说透(真正对应到代码)也盼高手能够给予补充

[] [] [] []

               

上一篇:从.NET类库代码来看ASP.NET运行时[1]

下一篇:提高ASP.Net应用程序性能的十大方法[1]