共用方式為


參考元件

參考元件 是一種特殊的元件類型,只包含代表連結庫公用 API 介面所需的元數據數量下限。 其中包括在建置工具中參考組件時所有重要成員的宣告,但排除所有成員的實作以及對私人成員的宣告,因為這些對其 API 合約沒有產生可見影響。 相反地,一般元件稱為 實作元件

無法載入參考元件以執行,但可以使用與實作元件相同的方式傳遞作為編譯程序輸入。 參考元件通常會隨著特定平台或程式庫的軟體開發工具包(SDK)一起發佈。

使用參考元件可讓開發人員建置以特定連結庫版本為目標的程式,而不需要該版本的完整實作元件。 假設您計算機上只有最新版的一些連結庫,但您想要建置以舊版該連結庫為目標的程式。 如果您直接針對實作元件進行編譯,您可能會不小心使用舊版中無法使用的 API 成員。 只有在目標電腦上測試程式時,您才會發現這個錯誤。 如果您針對舊版的參考元件進行編譯,您就會立即收到編譯時間錯誤。

參考元件也可以代表合約,也就是一組未對應到具體實作元件的 API。 這類參考元件稱為 合約元件,可用來以支援相同 API 集合的多個平臺為目標。 例如,.NET Standard 提供合約元件 netstandard.dll,代表不同 .NET 平臺之間共用的一組通用 API。 這些 API 的實作包含在不同平臺上的不同元件中,例如 .NET Framework 上的 mscorlib.dll 或 .NET Core 上的 System.Private.CoreLib.dll 。 以 .NET Standard 為目標的連結庫可以在支援 .NET Standard 的所有平台上執行。

使用參考元件

若要從您的專案使用特定 API,您必須將參考新增至其元件。 您可以將參考加入至實作元件或參考元件。 建議您在有提供的時候使用參考元件。 這麼做可確保您只使用目標版本中支援的 API 成員,供 API 設計工具使用。 使用參考元件可確保您不會相依於實作詳細數據。

.NET Framework 程式庫的參考組件會在目標套件中一併發行。 您可以下載獨立安裝程式,或在 Visual Studio 安裝程式中選取元件來取得它們。 如需詳細資訊,請參閱 安裝適用於開發人員的 .NET Framework。 針對 .NET Core 和 .NET Standard,參考元件會視需要自動下載,並透過 NuGet 進行參考。 針對 .NET Core 3.0 和更新版本,核心架構的參考元件位於 Microsoft.NETCore.App.Ref 套件中( Microsoft.NETCore.App 套件會改用於 3.0 之前的版本)。

當您使用 [ 新增參考 ] 對話框在 Visual Studio 中新增 .NET Framework 元件的參考時,您會從清單中選取元件,而 Visual Studio 會自動尋找對應至專案中所選取目標 Framework 版本的參考元件。 同樣適用於使用 Reference 專案項目直接將參考新增至 MSBuild 專案:您只需要指定元件名稱,而非完整檔案路徑。 當您使用 -reference 編譯程式選項(在 C#Visual Basic 中)或使用 Compilation.AddReferences Roslyn API 中的 方法,在命令行中新增這些元件的參考時,您必須手動指定正確目標平臺版本的參考元件檔。 .NET Framework 參考元件檔案位於 %ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\。NETFramework 目錄。 針對 .NET Core,您可以透過設定專案屬性 PreserveCompilationContext,強制發佈操作,將目標平台的參考元件複製到輸出目錄的 true 子目錄中。 然後,您可以將這些參考元件檔案傳遞至編譯程式。 使用DependencyContext來自 Microsoft.Extensions.DependencyModel 套件有助於找出其路徑。

因為它們不包含實作,所以無法載入參考元件來執行。 嘗試這樣做會導致 System.BadImageFormatException。 如果您要檢查參考元件的內容,可以將它載入 .NET Framework 中的僅供反映的環境(使用 Assembly.ReflectionOnlyLoad 方法)或載入 MetadataLoadContext 中的 .NET 和 .NET Framework。

產生參考組件

當您的連結庫取用者需要針對許多不同版本的連結庫建置其程式時,產生連結庫的參考元件可能會很有用。 分發所有這些版本的實作組件可能因其體積龐大而不切實際。 參考元件較小,將它們作為您程式庫 SDK 的一部分散發,可減少下載大小並節省磁碟空間。

IDE 和建置工具也可以利用參考元件,減少由多個類別庫組成的大型解決方案的建置時間。 通常,在增量建置情況中,如果任何輸入檔或所依賴的程式集有所變更,專案會被重建。 每當程式設計人員變更任何成員的實作時,實作元件就會變更。 參考元件只會在其公用 API 受到影響時變更。 因此,在某些情況下,使用參考元件做為輸入檔,而不是實作元件,允許略過相依專案的建置。

您可以生成參考組件:

如果您想要使用 NuGet 套件散發參考元件,則必須將它們包含在套件目錄下的 ref\ 子目錄中,而不是用於實作元件的 lib\ 子目錄中。

參考元件結構

參考元件是相關概念的擴充, 僅限元數據的元件。 僅含元數據的組件,其方法主體會被替換為單一的 throw null 主體,但包含所有成員,匿名型別除外。 使用 throw null 主體(而不是沒有主體)的原因是 PEVerify 可以執行和傳遞(從而驗證元數據的完整性)。

參考元件會進一步從僅限元數據的元件中移除元數據(私用成員):

  • 參考元件只具有 API 介面中所需項目的參考。 實際元件可能會有與特定實作相關的其他參考。 例如,class C { private void M() { dynamic d = 1; ... } } 的參考元件不會參考 dynamic 所需的任何型別。
  • 私有函式成員(方法、屬性和事件)只有在移除它們不會對編譯產生可觀察影響時才會被移除。 如果沒有 InternalsVisibleTo 屬性,也會移除內部函式成員。

參考元件中的元數據會繼續保留下列資訊:

  • 所有類型,包括私人和巢狀類型。
  • 所有屬性,甚至是內部屬性。
  • 所有虛擬方法。
  • 明確介面實作。
  • 明確實作的屬性和事件,因為其存取子是虛擬的。
  • 所有結構領域。

參考元件包含元件層級 ReferenceAssembly 屬性。 這個屬性可以在來源中指定;然後編譯程式不需要合成它。 由於這個屬性,執行環境不會載入參考元件以供執行(但可以在僅供反射模式中載入它們)。

確切的參考元件結構詳細數據取決於編譯程式版本。 如果較新版本判斷為不會影響公用 API 介面,可能會選擇排除更多元數據。

備註

本節中的資訊僅適用於從 C# 7.1 版或 Visual Basic 15.3 版開始的 Roslyn 編譯程式所產生的參考元件。 .NET Framework 和 .NET Core 程式庫的參考元件結構在某些細節上可能會有所不同,因為它們使用自己的機制來生成參考元件。 例如,它們可能會有完全空白的方法主體,而不是 throw null 主體。 但一般原則仍然適用:它們沒有可使用的方法實作,而且只包含從公用 API 觀點具有可觀察影響的成員的元數據。

另請參閱