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

CLR 深度解析:Silverlight 2 CoreCLR 架構、安全模型與跨平台實現

     編輯:關於.NET

Silverlight 2 將 .NET Framework 的豐富程式設計模型 (BCL、XAML、C#、VB) 帶入瀏覽器,其核心是專為 Web 客戶端打造的 **CoreCLR**——一個僅 4.3 MB (Beta 1)、6-10 秒完成安裝的精簡執行引擎。本文深入剖析 CoreCLR 的架構取捨、安全透明模型、基底類別庫 (BCL) 精簡策略、獨立儲存、以及跨平台抽象層 (PAL) 設計。

CoreCLR 設計目標:極致體積與桌面級相容

  • 體積:coreclr.dll + mscorlib.dll ≈ 桌面 CLR 兩大核心組件總和
  • 相容:針對 CLR 編寫的代碼行為一致;堆疊底層 (執行引擎、類型系統、GC、JIT、線程池) **共用原始碼**
  • 並行:CoreCLR 必須與桌面 CLR **同進程並行運行** (如 WPF 應用內嵌 WebBrowser 控件載入 Silverlight)

關鍵架構差異

同進程並行:解決「一進程雙 CLR」難題

傳統 CLR 假設進程僅有一個執行個體,靜態狀態、GC 線程掛起、區段管理均為進程級單例。CoreCLR 引入 **隔離機制**:

  • 各自獨立的靜態變數、托管堆、GC 線程
  • GC 協作協議避免相互掛起對方線程
  • 區段分配隔離,避免位址空間衝突

此技術最終將回饋桌面 CLR,實現多版本並行 (Side-by-side in-process)。

安全透明模型:三層代碼分級

圖 1:CoreCLR 安全執行機制

組件桌面 CLRCoreCLR理由
JIT 編譯器完整優化 (分層、內聯、向量化...)側重啟動速度,簡化優化RIA 應用生命週期短,啟動體驗優先
GC 模式工作站 / 伺服器 GC僅工作站 GC (互動式優化)瀏覽器單進程,無多 CPU 伺服器負載
CAS (代碼訪問安全)完整策略、權限集、沙箱**完全移除**,改用安全透明模型Web 僅需單一沙箱 (同 IE 腳本),CAS 過度複雜
BCL完整功能集精簡子集,與 .NET Compact Framework 對齊移除無意義功能 (Console、Registry、完整 Security...)

規則:

  • 透明 → 透明 / SafeCritical ✓
  • 透明 → 關鍵 ✗
  • SafeCritical → 關鍵 ✓ (代表透明代碼)
  • 關鍵 → 任意 ✓

**優勢**:絕大多數應用代碼為透明,安全審核聚焦於極小關鍵面;DLR (動態語言運行時) 完全以透明代碼編寫。

BCL 精簡策略:刪除重複、依賴作業系統

1. 泛型取代非泛型集合

.NET 2.0 引入泛型後,List<T> 等提供型別安全、避免裝箱、效能更優。Silverlight BCL **移除 ArrayList、Hashtable 等非泛型集合**,統一泛型 API。

2. 全球化資料外移至作業系統

桌面 CLR 內建龐大文化特性資料表 (隨時間過期、Windows 中心)。CoreCLR **不內建資料**,CultureInfo 委託宿主 OS (Windows / Mac OS X) 提供全球化行為,應用在 Mac 上像 Mac、在 Windows 上像 Windows。

3. 獨立儲存:沙箱應用的虛擬檔案系統

源自 .NET 1.0,Silverlight 發揚光大:

using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
using (var writer = new StreamWriter(isoStore.CreateFile("data.txt")))
{
    writer.Write("跨會話持久化狀態");
}
  • 支援目錄/檔案建立、讀寫、刪除
  • 配額預設 1 MB/應用程式組 (以網域劃分,如 *.microsoft.com 共享)
  • 用戶可透過 Silverlight 設定對話框擴充配額、刪除儲存
  • 不適合高價值機密 (密碼),但存放位置隱蔽、僅擁有者可存取

4. UI 線程與 Dispatcher

單一 UI 線程模型,Dispatcher 處理跨線程 UI 更新:

MyListBox.Dispatcher.BeginInvoke(() => MyListBox.ItemsSource = MyItems);

建議使用 BackgroundWorker 封裝背景運算與 UI 更新,保留低階線程 API 相容。

跨平台抽象層 (PAL):CoreCLR 運行於 Mac OS X 的關鍵

圖 2:平台適配層架構

  • PAL 實作 CoreCLR 所需的 Win32 API 子集:錯誤處理、檔案 I/O、網路、線程語義、異常處理...
  • **不實作** Registry、GDI+、COM 等 Silverlight 不需功能
  • Mac OS X 基於 Mach 微核心 + BSD,異常處理 (Objective-C) 與 C++ 不相容;無 I/O 完成埠;路徑分隔符差異...
  • 受惠於 SSCLI (Rotor) 經驗,針對 Intel Mac 專用實現,體積小、效能高

平台支援矩陣

層級信任度能力範例
透明代碼最低無法提權、無法存取敏感資源;僅能呼叫透明或 SafeCritical 代碼**所有 Silverlight 應用程式代碼**
SafeCritical 代碼中間橋樑層:驗證/清理輸入 → 呼叫關鍵代碼 → 清理輸出保護系統BCL 內部封裝 P/Invoke 的封送方法
關鍵代碼最高可 P/Invoke、含不可驗證 IL、直接操作系統資源**僅限 Silverlight 平台組件** (coreclr.dll、系統庫)

總結與展望

  • CoreCLR 證明:.NET 可精簡至 4 MB 級別仍保持豐富程式模型
  • 安全透明模型大幅降低攻擊面,將成未來桌面 CLR 安全架構基石
  • 同進程並行技術打破單進程單 CLR 限制,啟用嵌入式托管場景
  • PAL 架構展示跨平台托管運行時的工程化路徑
  • CoreCLR 設計決策 (精簡 BCL、移除 CAS、泛型優先) 將持續影響 .NET 生態演進

Silverlight 2 讓 Web 開發擁有桌面級生產力,CoreCLR 是其背後的工程傑作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
平台運行時備註
Windows (x86/x64)CoreCLR完整功能
Mac OS X (Intel)CoreCLR同 Windows 位元組碼,PAL 適配
LinuxMoonlight (Mono)Novell 合作,非 Microsoft 官方
Windows Mobile / Symbian.NET Compact Framework記憶體佔用更低