次の方法で共有


共通言語ランタイムでの型転送

型転送を使用すると、元のアセンブリを使用するアプリケーションを再コンパイルしなくても、型を別のアセンブリに移動できます。

たとえば、アプリケーションが Utility.dllという名前のアセンブリで Example クラスを使用するとします。 Utility.dll の開発者は、アセンブリのリファクタリングを決定し、その過程で、Example クラスを別のアセンブリに移動する可能性があります。 Utility.dll の古いバージョンが新しいバージョンの Utility.dll とそのコンパニオン アセンブリに置き換えられた場合、Example クラスを使用するアプリケーションは、新しいバージョンのUtility.dllExample クラスを見つけることができないため、失敗します。

Utility.dll の開発者は、TypeForwardedToAttribute属性を使用して、Example クラスの要求を転送することでこれを回避できます。 属性が新しいバージョンの Utility.dllに適用されている場合、 Example クラスの要求は、クラスを含むアセンブリに転送されます。 既存のアプリケーションは、再コンパイルせずに正常に機能し続けます。

型を転送する

型を転送するには、次の 4 つの手順があります。

  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}";
}

次に、消費しているプロジェクトがあり、 コンシューマー アセンブリで表されていることを想像してください。 この使用するプロジェクトは、 ユーティリティ アセンブリを参照します。 たとえば、 Example オブジェクトをインスタンス化し、 Program.cs ファイル内 のコンソールに書き込みます。

using System;
using Common.Objects;

Example example = new();

Console.WriteLine(example);

使用しているアプリを実行すると、 Example オブジェクトの状態が出力されます。 この時点では、 Consuming.csprojUtility.csproj を参照する場合、型転送はありません。 ただし、 ユーティリティ アセンブリの開発者は、リファクタリングの一環として Example オブジェクトを削除することにしました。 この型は、新しく作成された Common.csproj に移動されます。

ユーティリティ アセンブリからこの型を削除することで、開発者は破壊的変更を導入しています。 使用しているすべてのプロジェクトは、最新の ユーティリティ アセンブリに更新すると中断されます。

使用しているプロジェクトに 共通 アセンブリへの新しい参照の追加を要求する代わりに、型を転送できます。 この型は ユーティリティ アセンブリから削除されたため、 Utility.csprojCommon.csproj を参照する必要があります。

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

上記の C# プロジェクトは、新しく作成された 共通 アセンブリを参照するようになりました。 これは、 PackageReference または ProjectReferenceのいずれかです。 ユーティリティ アセンブリは、型転送情報を提供する必要があります。 慣例により、型順方向宣言は通常、TypeForwardersという名前の単一ファイルにカプセル化されます。ユーティリティ アセンブリ内の次の TypeForwarders.cs C# ファイルを考慮してください。

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

[assembly:TypeForwardedTo(typeof(Example))]

ユーティリティ アセンブリは Common アセンブリを参照し、Example型を転送します。 型転送宣言を使用して Utility アセンブリをコンパイルし、 Utility.dll使用 bin にドロップする場合、使用しているアプリはコンパイルされずに動作します。

こちらも参照ください