共用方式為


Common Language Runtime 中的類型轉送

類型轉送可讓您將類型移至另一個元件,而不需要重新編譯使用原始元件的應用程式。

例如,假設應用程式在名為 Example 的元件中使用 類別。 Utility.dll 的開發人員可能會決定重構元件,而且在這個過程中,他們可能會將 Example 類別移至另一個元件。 如果舊版的Utility.dll 取代為新版本的Utility.dll 及其隨附元件,則使用 Example 類別的應用程式會失敗,因為它無法在新版本Example中找到 類別。

Utility.dll 的開發人員可以避免這種情況,方法是使用 Example 屬性來轉送 TypeForwardedToAttribute 類別的要求。 如果屬性已被套用到新的版本 Utility.dll上,針對 Example 類別的請求會轉送至現在包含該類別的元件。 現有的應用程式會繼續正常運作,而不需重新編譯。

轉寄類型

轉送類型有四個步驟:

  1. 將型別的源代碼從原始組件移至目的地組件。

  2. 在原本放置型別的元件中,為已移動的型別新增 TypeForwardedToAttribute 。 下列程式代碼顯示已移動之類型 Example 的屬性。

     [assembly:TypeForwardedToAttribute(Example::typeid)]
    
     [assembly:TypeForwardedToAttribute(typeof(Example))]
    
  3. 現在包含該型別的元件進行編譯。

  4. 重新編譯曾經包含型別的元件,並參考現在包含該型別的元件。 例如,如果您要從命令行編譯 C# 檔案,請使用 References (C# 編譯程式選項) 選項來指定包含類型的元件。 在 C++ 中,使用來源檔案中的 #using 指示詞來指定包含類型的元件。

C# 類型轉送範例

從上述已嘗試的範例描述繼續,假設您正在開發 Utility.dll,而且您有一個 Example 類別。 Utility.csproj 是基本類別庫:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsing>true</ImplicitUsing>
  </PropertyGroup>

</Project>

類別 Example 提供一些屬性並覆寫 Object.ToString

using System;

namespace Common.Objects;

public class Example
{
    public string Message { get; init; } = "Hi friends!";

    public Guid Id { get; init; } = Guid.NewGuid();

    public DateOnly Date { get; init; } = DateOnly.FromDateTime(DateTime.Today);

    public sealed override string ToString() =>
        $"[{Id} - {Date}]: {Message}";
}

現在,假設有使用中的專案,並在 Consumer 元件中表示。 此消耗項目會參考 實用工具 程式集。 例如,它會具現化 物件, Example 並將其寫入主控台的 Program.cs 檔案中:

using System;
using Common.Objects;

Example example = new();

Console.WriteLine(example);

當取用的應用程式執行時,它會輸出物件的狀態 Example 。 此時,沒有任何類型轉送,因為 Consuming.csproj 參考 Utility.csproj。 不過,公用程式 元件的開發人員決定將 Example 物件移除作為重構的一部分。 此類型會移至新建立的 Common.csproj

藉由從 公用程式 元件中移除此類型,開發人員會引進重大變更。 所有取用項目都會在更新至最新的 公用程式 元件時中斷。

您可以將類型轉發,而不是要求取用專案將新的參考新增至 Common 組件。 由於此類型已從公用程式元件中移除,因此您必須讓Utility.csproj參考 Common.csproj

<ItemGroup>
  <ProjectReference Include="..\Common\Common.csproj" />
</ItemGroup>

上述 C# 專案現在會參考新建立的 Common 元件。 這可以是 PackageReferenceProjectReference公用程式元件必須提供型別轉送資訊。 依照慣例類型轉送宣告通常會封裝在名為 TypeForwarders的單一檔案中,請考慮公用程式元件中的下列TypeForwarders.cs C# 檔案:

using System.Runtime.CompilerServices;
using Common.Objects;

[assembly:TypeForwardedTo(typeof(Example))]

公用程式元件會參考 Common 元件,並轉送Example類型。 如果您要使用型別轉送宣告來編譯 公用程式 元件,並將 Utility.dll 放入 取用的二進位相容目錄,則取用的應用程式將不需編譯即可運作。

另請參閱