微軟在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可以同時被包含到這兩個項目之中。
二、文件鏈接
當我們采用默認的方式將一個現有的文件添加到當前項目之中的時候,Visual Studio會將目標文件拷貝到項目本地的目錄下,所以根本起不到共享的目的。但是針對現有文件的添加支持一種叫做“鏈接”的方式使添加到項目中的文件指向的依然是原來的地址,我們可以為多個項目添加針對同一個文件的鏈接以實現源文件跨項目共享。同樣還是上面演示分別針對Silverlight和WPF的兩個項目,不論項目文件和需要被共享的文件存在于哪個目錄下面,我們都可以采用如下圖所示的添加文件鏈接的方式分享這個Shared.cs文件。
三、Shared Project
項目的目的一般都是組織源文件和其他相關資源并最終編譯成一個可被部署的程序集。但是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#文件會自動作為當前項目的源文件參與編譯。
文章列表