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

跨平台程式碼共享實戰:同時支援 Windows 桌面與 Windows Mobile 的 .NET 開發策略

     編輯:關於.NET

隨著行動裝置普及,桌面開發人員越來越需要將既有業務邏輯移植至 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。

策略二:條件編譯——雙專案共享原始碼 (推薦)

  1. 建立裝置專案與桌面專案於同一目錄。
  2. 桌面專案以「加入現有項目 → 連結」方式引用裝置專案原始碼。
  3. 桌面專案屬性 → Build → 條件編譯符號加入 FULL_FRAME。
  4. 原始碼中以 #if FULL_FRAME ... #endif 隔離平台差異。

實戰範例:平台相依 API 隔離

// 輸入面板 (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) 滿足編譯,執行時不做事。
  • 分部類別:將平台專屬成員拆至獨立檔案,僅納入對應專案。
  • P/Invoke 條件化:#if FULL_FRAME const string Dll="kernel32.dll"; #else const string Dll="coredll.dll"; #endif
  • 擴充方法:.NET CF 3.5 支援擴充方法,可為缺失成員 (如 TextBox.Cut) 提供相容實作,桌面端自動呼叫原生方法。
  • 偵錯技巧:桌面專案參考裝置專案輸出,設為啟動專案即可在 Visual Studio 直接偵錯。

VS 輸出視窗偵測桌面組件 ILDASM Retargetable 標記 MainMenu 設計 裝置專案在桌面執行 加入現有項目建立連結 編譯時期錯誤範例 條件編譯符號設定 原生 vs 重定目標控制項外觀 同目錄雙專案檔案管理 附加至進程偵錯

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

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