サテライト アセンブリの読み込みアルゴリズム
サテライト アセンブリは、言語およびカルチャ用にカスタマイズされたローカライズされたリソースを格納するために使用されます。
サテライトアセンブリは、一般的なマネージド アセンブリとは異なる読み込みアルゴリズムを使用します。
サテライト アセンブリが読み込まれるタイミング
サテライト アセンブリは、ローカライズされたリソースを読み込むときに読み込まれます。
ローカライズされたリソースを読み込む基本的な API は System.Resources.ResourceManager クラスです。 最終的に ResourceManager クラスは、CultureInfo.Name ごとに GetSatelliteAssembly メソッドを呼び出します。
上位レベルの API は、低レベルの API を抽象化する場合があります。
アルゴリズム
.NET Core リソース フォールバック プロセスには次の手順が含まれます。
active
AssemblyLoadContext インスタンスを決定します。 いずれの場合も、active
インスタンスは実行中のアセンブリの AssemblyLoadContext です。active
インスタンスは、要求されたカルチャのサテライト アセンブリを以下の優先順位で読み込みます。そのキャッシュを確認します。
active
が AssemblyLoadContext.Default インスタンスの場合、既定のサテライト (リソース) アセンブリ プローブ ロジックを実行します。AssemblyLoadContext.Load 関数を呼び出します。
サテライト アセンブリに対応するマネージド アセンブリがファイルから読み込まれた場合、要求された CultureInfo.Name に一致するサブディレクトリのマネージド アセンブリのディレクトリを確認します (
es-MX
など)。Note
Linux と macOS では、サブディレクトリは大文字と小文字が区別されるため、次のいずれかでなければなりません。
- 大文字と小文字が完全に一致している。
- 小文字になっている。
AssemblyLoadContext.Resolving イベントを発生します。
AppDomain.AssemblyResolve イベントを発生します。
サテライト アセンブリが読み込まれる場合は、次のようになります。
- AppDomain.AssemblyLoad イベントが発生します。
- アセンブリ内で要求されたリソースが検索されます。 ランタイムによってアセンブリ内でリソースが見つかると、それを使用します。 リソースが見つからない場合は、検索を続けます。
注意
サテライト アセンブリ内のリソースを見つけるために、ランタイムでは現在の CultureInfo.Name の ResourceManager によって要求されたリソース ファイルが検索されます。 リソース ファイル内で、要求されたリソース名が検索されます。 いずれかが見つからない場合、リソースは見つからなかったものとして扱われます。
次に、ResourceManager は、可能性のある多くのレベルで親カルチャ アセンブリを検索し、そのたびに手順 2 と 3 を繰り返します。
各カルチャの親は 1 つだけで、CultureInfo.Parent プロパティによって定義されています。
カルチャの Parent プロパティが CultureInfo.InvariantCulture のとき、親カルチャの検索は停止します。
InvariantCulture については、手順 2 および 3 に戻らず、手順 5 に進みます。
リソースがまだ見つからない場合、ResourceManager では、既定の (フォールバック) カルチャのリソースが使用されます。
通常、既定のカルチャのリソースは、メイン アプリケーション アセンブリに格納されています。 ただし、NeutralResourcesLanguageAttribute.Location プロパティに UltimateResourceFallbackLocation.Satellite を指定することができます。 この値は、リソースの最終的なフォールバックの場所が、メイン アセンブリではなくサテライト アセンブリであることを示します。
注意
既定のカルチャは、最終的なフォールバックです。 したがって、既定のリソース ファイルにリソースの網羅的なセットを常に含めることをお勧めします。 これは、例外がスローされるのを防ぐのに役立ちます。 網羅的なセットを含めることにより、すべてのリソースに対してフォールバックが提供され、固有のカルチャではなくても、常に少なくとも 1 つのリソースがユーザーに存在することが保証されます。
最後に、
- ランタイムで既定の (フォールバック) カルチャのリソース ファイルが見つからない場合は、MissingManifestResourceException または MissingSatelliteAssemblyException 例外がスローされます。
- リソース ファイルが見つかり、要求されたリソースが存在しない場合は、要求から
null
が返されます。
.NET