閱讀509 返回首頁    go 阿裏雲 go 技術社區[雲棲]


“前.NET Core時代”如何實現跨平台代碼重用 ——源文件重用

微軟在2002年推出了第一個版本的 .NET Framework,這是一個主要麵向Windows 桌麵(Windows Forms)和服務器(ASP.NET Web Forms)的基礎框架。在此之後,PC的霸主地位不斷受到其他設備的挑戰甚至取代,為此微軟根據設備自身的需求對.NET Framework作了相應的簡化和改變,不斷推出了針對具體設備類型的.NET Framework,主流的包括Windows Phone、Windows Store、Silverlight和Xbox等,它們分別對移動、平板和遊戲設備提供支持。由於這些不同的.NET Framework是完全獨立的,這使我們很難開發一個支持多種設備的“可移植(Portable)”應用。與此同時,通過借助於Mono,.NET已經可以被成功移植到包括Mac OS、Linux、iOS、Android和FreeBSD等非Windows平台。

對於包括Mono在內的各個.NET Framework平台的BCL(Basic Class Library)來說,雖然在API定義層麵上存在一些共同之處,但是由於它們定義在不同的程序集之中,所以在PCL(Portal Class Library)推出之前,針對程序集的共享是不可能實現的,我們隻能在源代碼層麵實現共享。源代碼的共享通過在不同項目(針對不同.NET Framework平台)之間共享源文件的方式來實現,至於具體采用的方式,我們有三種不同的方案供你選擇。

對於一個能夠多個針對不同.NET Framework平台的項目共享的源文件,定義其中的代碼也有不少是針對具體某個.NET Framework平台的。對於這種代碼,我們需要按照如下的方式進行編寫,相應的項目以添加編譯的方式選擇與自身平台相匹配的代碼編譯道生成的程序集中。

   1: #if WINDOWS
   2:     <<針對Windows Desktop>>
   3: #elif XBOX
   4:     <<針對 Xbox>>
   5: #elif WINDOWS_PHONE
   6:     <<針對Windows Phone>>
   7: #else
   8:     <<針對其他平台>>
   9: #endif

如果多個針對不同.NET Framework平台的項目文件存在於同一個物理目錄下,存在於相同目錄下的源文件可以同時包含到這些項目中以實現共享的目的。如下圖所示,兩個分別針對Silverlight和WPF的項目共享相同的目錄,與兩個項目文件同在一個目錄下的C#文件Shared.cs可以同時被包含到這兩個項目之中。

image

當我們采用默認的方式將一個現有的文件添加到當前項目之中的時候,Visual Studio會將目標文件拷貝到項目本地的目錄下,所以根本起不到共享的目的。但是針對現有文件的添加支持一種叫做“鏈接”的方式使添加到項目中的文件指向的依然是原來的地址,我們可以為多個項目添加針對同一個文件的鏈接以實現源文件跨項目共享。同樣還是上麵演示分別針對Silverlight和WPF的兩個項目,不論項目文件和需要被共享的文件存在於哪個目錄下麵,我們都可以采用如下圖所示的添加文件鏈接的方式分享這個Shared.cs文件。

image

項目的目的一般都是組織源文件和其他相關資源並最終編譯成一個可被部署的程序集。但是Shared Project這種項目類型則比較特別,它隻有對源文件進行組織的功能,卻不能通過編譯生成程序集,它存在的目的就是為了實現源文件的共享。對於上麵我們介紹的兩種源代碼的共享方式來說,它們都是針對某個單一文件的共享,而Shared Project則可以對多個源文件進行打包以實現批量共享。

如下圖所示,我們可以創建一個Shared Project類型的項目Shared.shproj,並將需要共享的三個C#文件(Foo.cs、Bar.cs和Baz.cs)添加進來。我們將針對這個項目的引用同時添加到一個Silverlight項目(SilverlightApp.csproj)和Windows Phone項目(WinPhoneApp.csproj)之中,當我們對這兩個項目實施編譯的時候,包含在項目Shared.shproj中的三個C#文件會自動作為當前項目的源文件參與編譯。

image


作者:蔣金楠
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
原文鏈接

最後更新:2017-10-25 14:04:15

  上一篇:go  阿裏雲攜手NVIDIA拓展人工智能培訓計劃
  下一篇:go  “前.NET Core時代”如何實現跨平台代碼重用 ——程序集重用