非托管代碼如何啟動 CLR 執行托管代碼?答案在 **MSCOREE.DLL** —— Microsoft 將 CLR 實作為 COM 伺服器,透過標準 COM 介面暴露宿主功能。本節系統梳理導出函式、核心宿主介面、介面層次模型與實戰程式碼。
C:\Windows\System32> dumpbin /exports MSCOREE.DLL

圖 1 dumpbin 輸出導出函式清單
| 函式 | 用途 | 關鍵參數 |
|---|---|---|
CorBindToRuntimeEx | 啟動 CLR、取得宿主介面 | 版本、GC 模式 (wks/svr)、啟動旗標、CLSID/IID |
CorExitProcess | 終止非托管進程 | exitCode |
ClrCreateManagedInstance | 建立托管型別實例 | 型別名稱、IID、輸出物件指標 |
CallFunctionShim | 呼叫指定 DLL 函式 | DLL 名、函式名、兩個參數、版本 |
CorBindToCurrentRuntime | 依 XML 設定檔版本啟動 CLR | — |
CorBindToRuntimeByCfg | 依 XML 設定檔啟動 CLR | — |
HRESULT CorBindToRuntimeEx(
LPCWSTR pwszVersion, // "v4.0.30319" 或 NULL 取最新
LPCWSTR pwszBuildFlavor, // "wks" / "svr"
DWORD startupFlags, // STARTUP_FLAGS 組合
REFCLSID rclsid, // CLSID_CorRuntimeHost / CLSID_CLRRuntimeHost
REFIID riid, // IID_ICorRuntimeHost / IID_ICLRRuntimeHost
LPVOID* ppv); // 輸出介面指標
Start() / Stop() — CLR 進程級啟動/關閉ExecuteInDefaultAppDomain(assemblyPath, typeName, methodName, arg, &retVal) — 在預設域執行靜態方法ExecuteInAppDomain(domainId, callback, cookie) — 指定域執行委派GetCLRControl() → ICLRControl — 取得 CLR 控制介面SetHostControl(IHostControl) — 設定宿主控制介面 (必須在 Start 前呼叫)UnloadAppDomain(domainId, fWaitUntilDone) — 卸載指定域GetCurrentAppDomainId()Collect(generation) — 強制 GCGetStats(COR_GC_STATS*) — 取得 GC 統計SetGCStartupLimits(segmentSize, maxGen0Size) — 設定 GC 堆段/Gen0 上限GetHostManager(riid, ppObject) — 宿主提供的管理介面SetAppDomainManager(domainId, pUnkAppDomainManager) — 通知宿主新域建立
圖 2 介面層次:ICLR* 為 CLR 實作,IHost* 為宿主實作

圖 3 運行時功能對應:啟動/關閉、AppDomain、組件載入、記憶體/GC、執行緒/同步、I/O、偵錯、事件
命名慣例:
ICLR*介面由 CLR 實作 (如ICLRGCManager);IHost*介面由宿主實作 (如IHostMemoryManager)。
// 1. 啟動 CLR
ICLRRuntimeHost* pCLRHost = NULL;
HRESULT hr = CorBindToRuntimeEx(
L"v2.0.50727", // 版本
L"wks", // 工作站 GC
STARTUP_CONCURRENT_GC,
CLSID_CLRRuntimeHost,
IID_ICLRRuntimeHost,
(PVOID*)&pCLRHost);
hr = pCLRHost->Start(); // 初始化 CLR
// 2. 在預設 AppDomain 執行靜態方法
DWORD retVal = 0;
hr = pCLRHost->ExecuteInDefaultAppDomain(
L"Test.exe", // 組件路徑
L"Test.Program", // 型別全名
L"Start", // 靜態方法名
NULL, // 參數
&retVal); // 回傳值
// 3. 關閉
pCLRHost->Stop();
pCLRHost->Release();
IActionOnCLREvent、IApartmentCallback、IAppDomainBinding、ICatalogServicesICLRAssemblyIdentityManager、ICLRAssemblyReferenceList、ICLRControl、ICLRDebugManagerICLRErrorReportingManager、ICLRHostBindingPolicyManager、ICLRHostProtectionManagerICLRIoCompletionManager、ICLRMemoryNotificationCallback、ICLROnEventManager、ICLRPolicyManagerICLRProbingAssemblyEnum、ICLRReferenceAssemblyEnum、ICLRSyncManager、ICLRTask、ICLRTaskManager、ICLRValidatorICorConfiguration、ICorThreadpool、IDebuggerInfo、IDebuggerThreadControlIGCHostControl、IGCThreadControl、IHostAssemblyManager、IHostAssemblyStoreIHostAutoEvent、IHostCrst、IHostIoCompletionManager、IHostMAllocIHostManualEvent、IHostMemoryManager、IHostPolicyManager、IHostSecurityContextIHostSecurityManager、IHostSemaphore、IHostSyncManager、IHostTask實務建議:現代 .NET 應用極少手寫非託管宿主;若需自訂 CLR 行為,優先考慮 託管宿主 (AppDomainManager) 或
DbConfiguration/IHostControl等高層擴充點。
本文部分內容改編自《.NET安全揭秘》
作者:玄魂
出處:https://www.cnblogs.com/xuanhun/