首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

.NET 核心架構深度解析:CLR、MSCorEE、AppDomain 三大支柱關係圖譜

     編輯:關於ASP.NET

.NET 運行時基石由三大核心組件構成:CLR COM 伺服器、MSCorEE.dll 墊片、AppDomain 隔離邊界。本文從 C++ 宿主視角,還原它們的加載鏈路與記憶體模型。

1. CLR:COM 伺服器實體

  • 實現於 MSCorWks.dll(.NET Framework 4.0 前)或 clr.dll(4.0+)。
  • 安裝 .NET Framework 時,將 CLR 註冊為 COM 伺服器至登錄表:CLSID_CLRRuntimeHost。
  • 提供 ICLRRuntimeHost 介面:Start()、Stop()、ExecuteInDefaultAppDomain() 等。

2. MSCorEE.dll:版本選擇器(Shim)

  • 機器上僅有一份MSCorEE.dll(系統目錄),負責根據配置/環境變數決定載入哪個版本 CLR。
  • 非託管宿主調用 CorBindToRuntimeEx() 獲取 ICLRRuntimeHost 指標。
  • 支援 Side-by-Side:同進程可載入多個 CLR 版本(v2.0, v4.0 等)。

C++ 宿主啟動 CLR 範例

#include <Windows.h> #include <MSCorEE.h> #pragma comment(lib, "mscoree.lib")
int main() {
    ICLRRuntimeHost* pClrHost = nullptr;
    HRESULT hr = CorBindToRuntimeEx(
        NULL, NULL, 0,           // 使用預設版本策略
        CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID*)&pClrHost);
    if (FAILED(hr)) return -1;
    pClrHost->Start();           // 啟動 CLR
    // 執行組件、調用靜態方法...
    pClrHost->Stop();            // 關閉 CLR
    pClrHost->Release();
    return 0;
}

3. AppDomain:輕量級隔離容器

進程內多 AppDomain 結構

  • 單一 Windows 進程可承載多個 AppDomain(預設域、共享域、系統域、自定義域)。
  • 每個 AppDomain 擁有獨立的 Loader Heap(類型定義、靜態欄位、方法表)。
  • 系統域:載入 MSCorLib.dll 等核心組件,所有域共享(Domain-Neutral 載入)。
  • 共享域:載入強名稱組件(GAC),多域共享代碼但隔離靜態狀態。
  • 預設域:應用程式主域,載入應用組件。

記憶體與安全邊界

維度進程AppDomain
隔離成本高(獨立虛擬位址空間、句柄表)低(同進程、共享 CLR 實例)
通訊方式IPC (管道、Socket、共享記憶體)Remoting / MarshalByRefObject / 跨域委派
故障影響進程崩潰波及所有單域卸載不影響其他域
典型場景不同應用、不同信任層級插件系統、ASP.NET 應用池、單元測試隔離

實戰啟示

  • ASP.NET 為每個 Web 應用建立獨立 AppDomain,實現代碼隔離、動態更新(影子複製)、安全沙箱。
  • 插件架構:主程式建立沙箱 AppDomain 載入第三方組件,限制權限集(PermissionSet),卸載時釋放所有資源。
  • AppDomain.CurrentDomain.AssemblyResolve 事件可實現組件動態解析(如從資料庫、網路載入 DLL)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved