隨著行動裝置普及,桌面開發人員越來越需要將既有業務邏輯移植至 Windows Mobile。本文系統探討 .NET Framework (完整版) 與 .NET Compact Framework (精簡版) 的差異,並提出兩種主流程式碼共享策略:可重定目標 與 條件編譯,輔以實用技巧,助您以單一原始碼庫同時維護雙平台專案。
| 面向 | .NET Framework | .NET Compact Framework |
|---|---|---|
| 執行環境 | 桌面 CLR | 精簡版 CLR (GC、JIT 實作不同) |
| 類別庫覆蓋率 | 完整 | 約 80% 功能、20% 體積 |
| 缺失主要功能 | — | ASP.NET、CAS、二進位序列化、Reflection.Emit、CodeDOM |
| 獨有組件 | — | System.Data.SqlServerCe、System.Net.IrDA、Microsoft.WindowsMobile.DirectX、Microsoft.WindowsCE.Forms |
| UI 差異 | 可調整視窗、鍵盤滑鼠 | 全螢幕、觸控/手寫、無 ToolTip、無鍵盤快捷鍵 |
建立 Smart Device 專案編譯出的組件,因標記 Retargetable 屬性,可直接在桌面執行或被桌面專案參考。優點:單一輸出、零程式碼修改。缺點:不可使用任何桌面專屬 API,否則裝置端編譯失敗;且裝置專屬組件 (如 Microsoft.WindowsCE.Forms) 在桌面執行時會拋出 FileNotFoundException。
FULL_FRAME。#if FULL_FRAME ... #endif 隔離平台差異。// 輸入面板 (SIP) 僅存在裝置
#if !FULL_FRAME
Microsoft.WindowsCE.Forms.InputPanel inputPanel = new Microsoft.WindowsCE.Forms.InputPanel();
inputPanel.Enabled = true;
#endif
// 啟用視覺樣式僅限桌面
#if FULL_FRAME
Application.EnableVisualStyles();
#endif
Microsoft.WindowsCE.Forms.InputPanel) 滿足編譯,執行時不做事。#if FULL_FRAME const string Dll="kernel32.dll"; #else const string Dll="coredll.dll"; #endifTextBox.Cut) 提供相容實作,桌面端自動呼叫原生方法。

結語:建議以條件編譯為主策略,僅共享業務邏輯層,UI 層分別實作以發揮各平台優勢。掌握上述技巧,即可高效維護雙平台專案,減少 Copy/Paste 錯誤與維護成本。