從 Visual Studio 2015 起,共用項目 (Shared Project) 作為新的一種項目類型被添加到項目模板列表中,它的主要目的是使多個不同類型的項目之間可以共用代碼或資源。相比它的前任 PCL(Portable Class Library),它要靈活得多。因為 Shared Pr ...
從 Visual Studio 2015 起,共用項目 (Shared Project) 作為新的一種項目類型被添加到項目模板列表中,它的主要目的是使多個不同類型的項目之間可以共用代碼或資源。相比它的前任 PCL(Portable Class Library),它要靈活得多。因為 Shared Project 共用的是代碼或資源,並且不會創建單獨的程式集;而 PCL 則是共用程式集,需要單獨編譯,且會生成單獨的程式集。
在項目中,使用 Shared Project 可以幫助我們很容易地解決一些難題。本文主要討論,在開發過程中,我們如何使用它以及它具體能夠幫助我們解決哪些問題。在這之前,首先來看如何創建與使用 Shared Project。
創建與使用
前面說過,Shared Project 是一種項目模板類型,因此我們可以在現有的解決方案中創建一個新項目,然後在項目模板列表中選擇 Shared Project:
在這個 Shared Project 中我們可以添加所有需要與其它項目共用的代碼或資源(如圖片、Html文件、JS 文件等)。另外,為了保持它與現有項目命名空間一致,可以在“解決方案管理器"中右擊它,選擇”屬性“,更改其 Root namespace。
接著,要在那些需要引用它的項目中對其添加引用,如下:
當引用後,所有在 Shared Project 中代碼和資源能夠在這些項目中正常使用。
此外,Shared Project 自己無法編譯,我們需要通過編譯引用它的項目來生成 exe 或 dll 等程式集。並且 Shared Project 本身不會輸出為程式集。
使用場景
場景一:輸出針對不同 .NET Framework 版本的類庫
如果你正在開發一個類庫或框架,而且最終要發佈它,好讓別人能夠使用,所以你的類庫可能需要滿足多個 .NET Framework 版本,如 2.0/3.5/4.0/4.5 等,由於更高版本的 Framework 加入了更多的 API 以及更多的語法,使得在代碼編寫時更容易,比如 LINQ 等,然而低版本卻不支持,因此在類庫中的代碼就需要對不同的版本有區分。
對於這種情況,藉助於 Shared Project 和條件編譯符號 (Conditional compilation symbols),就可以解決上述問題。我們可以這樣做:
1. 創建一個 Shared Project 項目;
2. 再分別創建多個類庫 (Class Library) 項目,它們的目標框架 (Target framework) 分別指定不同的 Framework 版本;
3. 為每個類庫類目設置不同的條件編譯符號(在項目屬性中的“編譯”選項卡裡設置),如 NET2_0/NET4_0/NET4_5 等;
4. 然後,在 Shared Project 中就可以使用這些符號來判斷 Framework 版本,並寫出針對不同版本的代碼,例如下麵的代碼(註意其中加粗部分):
this.windowChrome = new WindowChrome { #if NET4_5 ResizeBorderThickness = SystemParameters.WindowResizeBorderThickness, #else ResizeBorderThickness = SystemParameters2.Current.WindowResizeBorderThickness, #endif CaptionHeight = 0, CornerRadius = new CornerRadius(0), GlassFrameThickness = new Thickness(0), UseAeroCaptionButtons = false };
場景二:輸出針對不同 Platform 的類庫
如果項目中一個(或多個)類庫需要同時支持 x86 與 x64 兩個不同的 Platform,以使軟體能夠在 x86/x64 上都能運行,這時 Shared Project 也可以派上用場。
一個具體的例子是開發 Office 載入項,如果你的載入項是 COM 類型的,則需要分別為 32位與 64位 Office 提供對應的版本。對於32位,程式集的目標平臺 (Platform target) 可以是 Any CPU,但對於64位,則應該是 x64。
使用 Shared Project 可以很容易解決這樣的問題,具體做法:
1. 針對載入項創建一個 Shared Project,將所有代碼與資源文件放到這個項目中;
2. 分別創建兩個不同的 Class Library,使它們引用 Shared Project,不同的是,這兩個項目的目標平臺不一樣,一個是 Any CPU,另一個是 x64;
3. 如果用到了第三方庫,為兩個項目添加同樣的引用;
4. 除此以外,你還要修改它們的程式集名稱,使它們的輸出的程式集名稱有區別、且有意義。
最後,需要註意的是,修改項目屬性時,無論是設置"條件編譯符號",還是修改"目標平臺",都要註意它們都與項目的配置 (Debug/Release) 是關聯的,也就是說,在 Debug 配置中改了,還要在 Release 配置中改;對於此,一個替代的辦法是,從配置下拉列表選擇“所有配置”,然後再設置符號或目標平臺,則能夠對 Debug/Release 都有效。
總結
本文主要討論了 Shared Project 的使用以及它的實際使用場景,它能夠使我們的程式集面向不同 .NET Framework 版本以及不同的 Platform。
其實不難看出,這都是通過修改項目的屬性而實現的,這樣一來,多個項目就可以達到代碼相同、程式集屬性卻不同,從而解決實際對應的問題。如果你在開發過程中遇到了類似的問題,也可以嘗試一下使用 Shared Project 來解決。
延伸閱讀:
Developing Libraries with Cross Platform Tools