好
現在我們知道了ISAPIRuntime對象是托管代碼的入口點
那麼這個對象是什麼時候產生的呢?換句話說
w
wp也是一個非瀀?潳楬?托管代碼寫出的程序
它是在什麼時候把
net運行時加載進來的呢?(如果好奇心再強一點
還可以問一問一個工作進程是什麼時刻產生並開始運行的
它和應用程序池有著怎樣的交互
)完全解釋清楚這些問題已經超過了筆者目前的能力范圍
還望高人補充或提供資料線索
但目前我們從
net的代碼中應該可以推斷出
ISAPIRuntime對象和應用程序域是對應的
net在創建應用程序域的時候
就會創建ISAPIRuntime對象
見下面的創建應用程序域的代碼
創建應用程序域
/**//*這是System
Web
Hosting
AppDomainFactory類型的Create方法
它調用的是實際工廠的Create方法
*/
[return: MarshalAs(UnmanagedType
Interface)]
public object Create(string module
string typeName
string appId
string appPath
string strUrlOfAppOrigin
int iZone)
{
/**//*實際工廠是一個AppManagerAppDomainFactory類型的對象
*/
return this
_realFactory
Create(appId
appPath);
}
/**//*AppManagerAppDomainFactory
Create方法
請看代碼內的注釋
*/
[return: MarshalAs(UnmanagedType
Interface)]
public object Create(string appId
string appPath)
{
object obj
;
try
{
if (appPath[
] ==
)
{
FileInfo info = new FileInfo(appPath);
appPath = info
FullName;
}
if (!StringUtil
StringEndsWith(appPath
\\
))
{
appPath = appPath + @
\
;
}
ISAPIApplicationHost appHost = new ISAPIApplicationHost(appId
appPath
false);
/**//*這個方法內部的調用鏈非常復雜
它一方面創建了一個應用程序域
一方面返回一個ISAPIRuntime對象
具體這個方法究竟是如何創建AppDomain對象的
大家可以用
JetBrain來跟蹤其調用棧
關於這部分內容更詳盡的信息
可參見ASP
NET Internals
The bridge between ISAPI and Application Domains一文
另外
如果您使用JetBrain來調試系統程序集的話
有可能會因為缺少相應pdb文件而不能查看完整調試信息
這裡提供一個根據已有程序集
先反匯編成中間碼
再重新以調試模式生成dll和pdb文件的方法
)生成IL文件: ildasm /tok /byt system
web
dll /out=system
web
il
)重新生成PDB/DLL: ilasm system
web
il /DEBUG /DLL /OUTPUT=System
Web
dll*/
ISAPIRuntime o = (ISAPIRuntime) this
_appManager
CreateObjectInternal(appId
typeof(ISAPIRuntime)
appHost
false
null);
o
SetThisAppDomainsIsapiAppId(appId);
o
StartProcessing();
obj
= new ObjectHandle(o);
}
catch (Exception)
{
throw;
}
return obj
;
}
寫在前面的話網上講Aspnet運行模式的好文章已經很多了筆者本不用多此一舉另成一文但從筆者自己的學習經驗看如果學到的這些知識不能對應到類庫中的源代碼印象總歸不夠深刻大有隔靴搔癢之感只好自己寫上一篇對這方面的知識做個小小的總結文中所有內容都是筆者在看了網上很多文章後結合自己的開發經驗得出的一些理解難免有錯誤的地方歡迎批評指出另外由於筆者能力所限很多地方並未說透(真正對應到代碼)也盼高手能夠給予補充
[] [] [] []
From:http://tw.wingwit.com/Article/program/net/201311/15293.html