核心架構差異
| 維度 | COM 組件 | .NET 組件 |
| 本質 | 二進制標準,規範組件交互契約 | 托管代碼,運行於 CLR 虛擬機 |
| 文件格式 | DLL/EXE (原生機器碼) | DLL/EXE (MSIL 中間語言) |
| 依賴運行時 | 無(系統級組件) | .NET Framework / .NET Core / .NET 5+ |
| 內存管理 | 手動引用計數 | 自動垃圾回收 (GC) |
| 跨語言調用 | 通過二進制兼容實現 | 通過 CTS/CLS 實現無縫互操作 |
| 版本控制 | 註冊表 GUID,易發生 DLL Hell | 強名稱程序集 + GAC / 側邊加載 |
| 安全性 | 依賴系統 ACL | 代碼訪問安全 (CAS) + 沙箱 |
常見問題解答
Q1: MFC 程序不裝 .NET 能在 XP 運行,說明內核一致?
Windows 2000 後內核架構統一(NT 內核),版本差異在子系統層。MFC 直接調用 Win32 API,無需 .NET 運行時,故兼容性好。
Q2: 現在學 COM 還有用嗎?
有價值,但領域縮小:
- ✅ Windows Shell 擴展、Office 加載項、DirectX、瀏覽器插件
- ✅ 老系統維護、C++ 高性能組件跨語言調用
- ❌ 新業務開發首選 .NET / .NET Core
若只調用現成 COM(如 Excel 自動化),無需深學 COM 開發,掌握 CoCreateInstance、QueryInterface、智能指針 CComPtr/_com_ptr_t 即可。
Q3: 學 MFC COM 還是 ATL?
強烈建議 ATL:
- MFC COM 支持僅封裝基礎,樣板代碼多、調試難
- ATL 是 COM 開發標準庫,提供
CComObjectRootEx、CComCoClass、屬性註冊等現代設施
- VS 向導完美支持 ATL 專案創建
Q4: DLL 能替代 COM 思想嗎?
不能。DLL 只是動態鏈接庫(代碼容器),COM 是組件對象模型(架構規範):
- COM 定義:接口二進制佈局、生命周期管理、註冊發現、編組、安全上下文
- DLL 導出函數無類型系統、無版本協商、無跨進程/跨機器透明調用
- COM 可進程外/遠程調用,DLL 僅進程內
Q5: COM、COM+、.NET 三者關係
- COM:基礎二進制標準
- COM+ (MTS 繼承者):COM 的企業級擴展,提供事務、對象池、即時激活、事件系統等中間件服務,底層仍是 COM
- .NET:新一代托管運行時,可通過 COM Interop 雙向調用 COM/COM+
選型建議
新項目:
- 優先 .NET 6+/Core — 跨平台、高性能、生態現代
- 需調用舊 COM → 使用 COM Interop /
dynamic 關鍵字
維護舊 C++ COM:
- ATL 重構或保持現狀
- 漸進式遷移:核心邏輯編為 .NET Standard 庫,COM 做薄適配層