共用程式代碼概觀

本文件比較跨平臺專案之間共用程序代碼的不同方法:.NET Standard、共用專案和可攜式類別庫,包括每個專案的優點和缺點。

跨平台應用程式之間共享程式碼的方法有三種:

  • .NET Standard 連結庫 – .NET Standard 專案可以實作程序代碼,以跨多個平台共用,而且可以存取大量的 .NET API(視版本而定)。 .NET Standard 1.0 - 1.6 會逐步實作較大的 API 集合,而 .NET Standard 2.0 則提供 .NET BCL 的最佳涵蓋範圍(包括 Xamarin 應用程式中提供的 .NET API)。
  • 共享專案 – 使用共用資產項目類型來組織原始程式碼,並使用 #if 編譯程式指示詞,視需要管理平臺特定需求。
  • 可攜式類別庫 (deprecated) – 可攜式類別庫 (PCL) 可以針對具有通用 API 介面的多個平臺,並使用介面來提供平臺特定功能。 PCL 在最新版本的 Visual Studio 中已被取代 – 請改用 .NET Standard。

程式代碼共用策略的目標是要支援此圖表中顯示的架構,其中多個平臺可以使用單一程式代碼基底。

Shared code application architecture

本文會比較可用來協助您為應用程式選擇正確項目類型的方法。

.NET Standard 連結庫

.NET Standard 連結庫提供一組定義完善的基類連結庫,可在不同的專案類型中參考,包括 Xamarin.Android 和 Xamarin.iOS 等跨平台專案。 建議使用 .NET Standard 2.0,以達到與現有 .NET Framework 程式代碼的最大相容性。

.NET Standard diagram

福利

  • 可讓您跨多個項目共享程序代碼。
  • 重構作業一律會更新所有受影響的參考。
  • .NET 基類庫 (BCL) 的介面區比 PCL 配置檔更大。 特別是,.NET Standard 2.0 的 API 介面與 .NET Framework 幾乎相同,建議用於新的應用程式和移植現有的 PCL。

缺點

  • 無法使用編譯程式指示詞,例如 #if __IOS__

備註

.NET Standard 類似於 PCL,但具有較簡單的平台支援模型,以及來自 BCL 的類別數目較多。

共用的專案

共用專案 包含任何參考這些專案的專案中包含的程式代碼檔案和資產。 共享專案不會自行產生已編譯的輸出。

此螢幕快照顯示包含三個應用程式專案的解決方案檔(適用於 Android、iOS 和 Windows),以及 包含一般 C# 原始碼檔案的共享 專案:

Shared project solution

下圖顯示概念架構,其中每個專案都包含所有共用原始程序檔:

Shared project diagram

範例

支援 iOS、Android 和 Windows 的跨平臺應用程式需要每個平臺的應用程式專案。 常見的程式代碼位於共享專案中。

範例解決方案會包含下列資料夾和專案(已選擇專案名稱以表達性,您的專案不需要遵循這些命名指導方針):

  • 共用 – 包含所有專案通用程式代碼的共享專案。
  • AppAndroid – Xamarin.Android 應用程式專案。
  • AppiOS – Xamarin.iOS 應用程式專案。
  • AppWindows – Windows 應用程式專案。

如此一來,三個應用程式項目會共用相同的原始程式碼(共用中的 C# 檔案)。 所有三個專案都會共用共享程序代碼的任何編輯。

福利

  • 可讓您跨多個項目共享程序代碼。
  • 您可以使用編譯程式指示詞,根據平臺來分支共用程式代碼(例如使用 #if __ANDROID__ ,如建置跨平臺應用程式檔中所述)。
  • 應用程式專案可以包含共用程式代碼可以利用的平臺特定參考(例如Community.CsharpSqlite.WP7,在 Windows 電話 的 Tasky 範例中使用 )。

缺點

  • 影響 『inactive』 編譯程式指示詞內程式代碼的重構將不會更新這些指示詞內的程式代碼。
  • 與大多數其他項目類型不同,共用項目沒有「輸出」元件。 在編譯期間,會將檔案視為參考專案的一部分,並編譯至該元件。 如果您想要將程式代碼共用為元件,則 .NET Standard 或可攜式類別庫是較佳的解決方案。

備註

對於撰寫程式代碼的應用程式開發人員來說,這是一個很好的解決方案,它只用於在其應用程式中共用(而不是散發給其他開發人員)。

可攜式類別庫

提示

建議透過可攜式類別庫使用 .NET Standard 2.0 連結庫。

可攜式類別庫會 在這裡詳細討論。

Portable class library diagram

福利

  • 可讓您跨多個項目共享程序代碼。
  • 重構作業一律會更新所有受影響的參考。

缺點

  • 建議改用最新版本的Visual Studio中取代 .NET Standard 連結庫。 請參閱此 說明 PCL 與 .NET Standard 之間的差異。
  • 無法使用編譯程式指示詞。
  • 只有 .NET Framework 的子集可供使用,由選取的配置檔決定(如需詳細資訊,請參閱 PCL 簡介)。

備註

PCL 範本在最新版本的 Visual Studio 中被視為已淘汰。

摘要

您選擇的程式代碼共用策略將由目標平台所驅動。 選擇最適合您專案的方法。

.NET Standard 是建置可共用程式代碼連結庫的最佳選擇(特別是在 NuGet 上發佈)。 共用專案適用於規劃在其跨平臺應用程式中使用許多平臺特定功能的應用程式開發人員。

雖然 Visual Studio 中仍支援 PCL 專案,但建議針對新專案使用 .NET Standard。