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

CLR 寄宿 (上):MSCOREE.DLL 核心導出函式、宿主介面與非託管啟動 CLR 實戰

     編輯:關於.NET

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

MSCOREE.DLL 主要導出函式 (100+)

C:\Windows\System32> dumpbin /exports MSCOREE.DLL

MSCOREE.DLL 導出函式列表

圖 1 dumpbin 輸出導出函式清單

函式用途關鍵參數
CorBindToRuntimeEx啟動 CLR、取得宿主介面版本、GC 模式 (wks/svr)、啟動旗標、CLSID/IID
CorExitProcess終止非托管進程exitCode
ClrCreateManagedInstance建立托管型別實例型別名稱、IID、輸出物件指標
CallFunctionShim呼叫指定 DLL 函式DLL 名、函式名、兩個參數、版本
CorBindToCurrentRuntime依 XML 設定檔版本啟動 CLR—
CorBindToRuntimeByCfg依 XML 設定檔啟動 CLR—

CorBindToRuntimeEx 簽章

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);               // 輸出介面指標

核心宿主介面速查

ICLRRuntimeHost (.NET 2.0+)

  • Start() / Stop() — CLR 進程級啟動/關閉
  • ExecuteInDefaultAppDomain(assemblyPath, typeName, methodName, arg, &retVal) — 在預設域執行靜態方法
  • ExecuteInAppDomain(domainId, callback, cookie) — 指定域執行委派
  • GetCLRControl() → ICLRControl — 取得 CLR 控制介面
  • SetHostControl(IHostControl) — 設定宿主控制介面 (必須在 Start 前呼叫)
  • UnloadAppDomain(domainId, fWaitUntilDone) — 卸載指定域
  • GetCurrentAppDomainId()

ICLRGCManager

  • Collect(generation) — 強制 GC
  • GetStats(COR_GC_STATS*) — 取得 GC 統計
  • SetGCStartupLimits(segmentSize, maxGen0Size) — 設定 GC 堆段/Gen0 上限

IHostControl

  • GetHostManager(riid, ppObject) — 宿主提供的管理介面
  • SetAppDomainManager(domainId, pUnkAppDomainManager) — 通知宿主新域建立

介面層次與功能模型

MSCOREE.DLL 介面層次模型

圖 2 介面層次:ICLR* 為 CLR 實作,IHost* 為宿主實作

介面功能模型

圖 3 運行時功能對應:啟動/關閉、AppDomain、組件載入、記憶體/GC、執行緒/同步、I/O、偵錯、事件

命名慣例:ICLR* 介面由 CLR 實作 (如 ICLRGCManager);IHost* 介面由宿主實作 (如 IHostMemoryManager)。

非託管宿主啟動 CLR 並執行代碼 (C++ 範例)

// 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、ICatalogServices
  • ICLRAssemblyIdentityManager、ICLRAssemblyReferenceList、ICLRControl、ICLRDebugManager
  • ICLRErrorReportingManager、ICLRHostBindingPolicyManager、ICLRHostProtectionManager
  • ICLRIoCompletionManager、ICLRMemoryNotificationCallback、ICLROnEventManager、ICLRPolicyManager
  • ICLRProbingAssemblyEnum、ICLRReferenceAssemblyEnum、ICLRSyncManager、ICLRTask、ICLRTaskManager、ICLRValidator
  • ICorConfiguration、ICorThreadpool、IDebuggerInfo、IDebuggerThreadControl
  • IGCHostControl、IGCThreadControl、IHostAssemblyManager、IHostAssemblyStore
  • IHostAutoEvent、IHostCrst、IHostIoCompletionManager、IHostMAlloc
  • IHostManualEvent、IHostMemoryManager、IHostPolicyManager、IHostSecurityContext
  • IHostSecurityManager、IHostSemaphore、IHostSyncManager、IHostTask

實務建議:現代 .NET 應用極少手寫非託管宿主;若需自訂 CLR 行為,優先考慮 託管宿主 (AppDomainManager) 或 DbConfiguration/IHostControl 等高層擴充點。


本文部分內容改編自《.NET安全揭秘》
作者:玄魂
出處:https://www.cnblogs.com/xuanhun/

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved