.NET 運行時基石由三大核心組件構成:CLR COM 伺服器、MSCorEE.dll 墊片、AppDomain 隔離邊界。本文從 C++ 宿主視角,還原它們的加載鏈路與記憶體模型。
MSCorWks.dll(.NET Framework 4.0 前)或 clr.dll(4.0+)。CLSID_CLRRuntimeHost。ICLRRuntimeHost 介面:Start()、Stop()、ExecuteInDefaultAppDomain() 等。CorBindToRuntimeEx() 獲取 ICLRRuntimeHost 指標。#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;
}

MSCorLib.dll 等核心組件,所有域共享(Domain-Neutral 載入)。| 維度 | 進程 | AppDomain |
|---|---|---|
| 隔離成本 | 高(獨立虛擬位址空間、句柄表) | 低(同進程、共享 CLR 實例) |
| 通訊方式 | IPC (管道、Socket、共享記憶體) | Remoting / MarshalByRefObject / 跨域委派 |
| 故障影響 | 進程崩潰波及所有 | 單域卸載不影響其他域 |
| 典型場景 | 不同應用、不同信任層級 | 插件系統、ASP.NET 應用池、單元測試隔離 |
PermissionSet),卸載時釋放所有資源。AppDomain.CurrentDomain.AssemblyResolve 事件可實現組件動態解析(如從資料庫、網路載入 DLL)。