扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
1/**//*InterfaceType(ComInterfaceType.InterfaceIsIUnknown)指明了这个接口将作为 IUnknown 派生接口向 COM 公开,这就使得isapi.dll可以以COM方式调用此接口。*/ 2[ComImport, Guid("08a2c56f-7c16-41c1-a8be-432917a1a2d1"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 3public interface IISAPIRuntime 4{ 5 void StartProcessing(); 6 void StopProcessing(); 7 /**//*ProcessRequest方法就是整个处理流程中托管代码和非托管代码的分界点,可以看到里面是以一个IntPtr结构传入了调用方(也就是isapi.dll)的ECB地址*/ 8 [return: MarshalAs(UnmanagedType.I4)] 9 int ProcessRequest([In] IntPtr ecb, [In, MarshalAs(UnmanagedType.I4)] int useProcessModel); 10 void DoGCCollect(); 11} 12 13/**//*这个类实现了IISAPIRuntime接口。它的实例对象存在于每一个AppDomain中,作为整个Asp.net运行时的入口。*/ 14public sealed class ISAPIRuntime : MarshalByRefObject, IISAPIRuntime, IRegisteredObject 15{ 16 // Fields 17 private static int _isThisAppDomainRemovedFromUnmanagedTable; 18 private static string s_thisAppDomainsIsapiAppId; 19 20 // Methods 21 [AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.Minimal), SecurityPermission(SecurityAction.Demand, Unrestricted=true)] 22 public ISAPIRuntime(); 23 public void DoGCCollect(); 24 public override object InitializeLifetimeService(); 25 /**//*处理请求的入口点方法,由isapi.dll以COM方式调用*/ 26 public int ProcessRequest(IntPtr ecb, int iWRType); 27 internal static void RemoveThisAppDomainFromUnmanagedTable(); 28 internal void SetThisAppDomainsIsapiAppId(string appId); 29 public void StartProcessing(); 30 public void StopProcessing(); 31 void IRegisteredObject.Stop(bool immediate); 32} |
1/**//*这是System.Web.Hosting.AppDomainFactory类型的Create方法,它调用的是实际工厂的Create方法。*/ 2[return: MarshalAs(UnmanagedType.Interface)] 3public object Create(string module, string typeName, string appId, string appPath, string strUrlOfAppOrigin, int iZone) 4{ 5 /**//*实际工厂是一个AppManagerAppDomainFactory类型的对象。*/ 6 return this._realFactory.Create(appId, appPath); 7} 8 9/**//*AppManagerAppDomainFactory.Create方法,请看代码内的注释。*/ 10[return: MarshalAs(UnmanagedType.Interface)] 11public object Create(string appId, string appPath) 12{ 13 object obj2; 14 try 15 { 16 if (appPath[0] == '.') 17 { 18 FileInfo info = new FileInfo(appPath); 19 appPath = info.FullName; 20 } 21 if (!StringUtil.StringEndsWith(appPath, '\\')) 22 { 23 appPath = appPath + @"\"; 24 } 25 ISAPIApplicationHost appHost = new ISAPIApplicationHost(appId, appPath, false); 26 /**//*这个方法内部的调用链非常复杂,它一方面创建了一个应用程序域,一方面返回一个ISAPIRuntime对象。具体这个方法究竟是如何创建AppDomain对象的,大家可以用 27 JetBrain来跟踪其调用栈。关于这部分内容更详尽的信息,可参见ASP.NET Internals - The bridge between ISAPI and Application Domains一文。 28 另外,如果您使用JetBrain来调试系统程序集的话,有可能会因为缺少相应pdb文件而不能查看完整调试信息,这里提供一个根据已有程序集,先反汇编成中间码, 29 再重新以调试模式生成dll和pdb文件的方法: 30 1)生成IL文件: ildasm /tok /byt system.web.dll /out=system.web.il 31 2)重新生成PDB/DLL: ilasm system.web.il /DEBUG /DLL /OUTPUT=System.Web.dll*/ 32 ISAPIRuntime o = (ISAPIRuntime) this._appManager.CreateObjectInternal(appId, typeof(ISAPIRuntime), appHost, false, null); 33 o.SetThisAppDomainsIsapiAppId(appId); 34 o.StartProcessing(); 35 obj2 = new ObjectHandle(o); 36 } 37 catch (Exception) 38 { 39 throw; 40 } 41 return obj2; 42} |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者