サテライト アセンブリの読み込みアルゴリズム

サテライト アセンブリは、言語およびカルチャ用にカスタマイズされたローカライズされたリソースを格納するために使用されます。

サテライトアセンブリは、一般的なマネージド アセンブリとは異なる読み込みアルゴリズムを使用します。

サテライト アセンブリが読み込まれるタイミング

サテライト アセンブリは、ローカライズされたリソースを読み込むときに読み込まれます。

ローカライズされたリソースを読み込む基本的な API は System.Resources.ResourceManager クラスです。 最終的に ResourceManager クラスは、CultureInfo.Name ごとに GetSatelliteAssembly メソッドを呼び出します。

上位レベルの API は、低レベルの API を抽象化する場合があります。

アルゴリズム

.NET Core リソース フォールバック プロセスには次の手順が含まれます。

  1. activeAssemblyLoadContext インスタンスを決定します。 いずれの場合も、active インスタンスは実行中のアセンブリの AssemblyLoadContext です。

  2. active インスタンスは、要求されたカルチャのサテライト アセンブリを以下の優先順位で読み込みます。

  3. サテライト アセンブリが読み込まれる場合は、次のようになります。

    • AppDomain.AssemblyLoad イベントが発生します。
    • アセンブリ内で要求されたリソースが検索されます。 ランタイムによってアセンブリ内でリソースが見つかると、それを使用します。 リソースが見つからない場合は、検索を続けます。

    注意

    サテライト アセンブリ内のリソースを見つけるために、ランタイムでは現在の CultureInfo.NameResourceManager によって要求されたリソース ファイルが検索されます。 リソース ファイル内で、要求されたリソース名が検索されます。 いずれかが見つからない場合、リソースは見つからなかったものとして扱われます。

  4. 次に、ResourceManager は、可能性のある多くのレベルで親カルチャ アセンブリを検索し、そのたびに手順 2 と 3 を繰り返します。

    各カルチャの親は 1 つだけで、CultureInfo.Parent プロパティによって定義されています。

    カルチャの Parent プロパティが CultureInfo.InvariantCulture のとき、親カルチャの検索は停止します。

    InvariantCulture については、手順 2 および 3 に戻らず、手順 5 に進みます。

  5. リソースがまだ見つからない場合、ResourceManager では、既定の (フォールバック) カルチャのリソースが使用されます。

    通常、既定のカルチャのリソースは、メイン アプリケーション アセンブリに格納されています。 ただし、NeutralResourcesLanguageAttribute.Location プロパティに UltimateResourceFallbackLocation.Satellite を指定することができます。 この値は、リソースの最終的なフォールバックの場所が、メイン アセンブリではなくサテライト アセンブリであることを示します。

    注意

    既定のカルチャは、最終的なフォールバックです。 したがって、既定のリソース ファイルにリソースの網羅的なセットを常に含めることをお勧めします。 これは、例外がスローされるのを防ぐのに役立ちます。 網羅的なセットを含めることにより、すべてのリソースに対してフォールバックが提供され、固有のカルチャではなくても、常に少なくとも 1 つのリソースがユーザーに存在することが保証されます。

  6. 最後に、

    • ランタイムで既定の (フォールバック) カルチャのリソース ファイルが見つからない場合は、MissingManifestResourceException または MissingSatelliteAssemblyException 例外がスローされます。
    • リソース ファイルが見つかり、要求されたリソースが存在しない場合は、要求から null が返されます。