熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

從.NET類庫代碼來看ASP.NET運行時[2]

2013-11-13 11:09:49  來源: .NET編程 
    好現在我們知道了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運行模式的好文章已經很多了筆者本不用多此一舉另成一文但從筆者自己的學習經驗看如果學到的這些知識不能對應到類庫中的源代碼印象總歸不夠深刻大有隔靴搔癢之感只好自己寫上一篇對這方面的知識做個小小的總結文中所有內容都是筆者在看了網上很多文章後結合自己的開發經驗得出的一些理解難免有錯誤的地方歡迎批評指出另外由於筆者能力所限很多地方並未說透(真正對應到代碼)也盼高手能夠給予補充

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/net/201311/15293.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.