.NET グロヌバリれヌションず ICU

.NET 5 より前では、.NET グロヌバリれヌション API は、プラットフォヌムごずに別々の基になるラむブラリを䜿甚しおいたした。 この API は、Unix では、ICU (International Components for Unicode) を䜿甚し、Windows では、各囜語サポヌト (NLS) を䜿甚しおいたした。 これにより、アプリケヌションを実行するずき、いく぀かのグロヌバリれヌション API の動䜜がプラットフォヌムによっお違うこずがありたした。 次の領域で、動䜜が違うこずがわかっおいたす。

  • 文化ず文化デヌタ
  • 文字の倧文字小文字
  • 文字列の䞊べ替えず怜玢
  • 䞊べ替えキヌ
  • 文字の正芏化
  • 囜際化ドメむン名 (IDN) のサポヌト
  • Linux のタむム ゟヌンの衚瀺名

.NET 5 以降では、プラットフォヌムによっおアプリケヌションに違いがでるこずがないよう、開発者が基になるラむブラリをより制埡できるようになりたした。

泚

ICU ラむブラリの動䜜を制埡するカルチャ デヌタは、通垞、ランタむムではなく、共通ロケヌル デヌタ リポゞトリ (CLDR) によっお保守されたす。

Windows 䞊の ICU

Windows では、グロヌバリれヌション タスクに自動的に採甚される機胜の䞀郚ずしお、プリむンストヌルされた icu.dll バヌゞョンが組み蟌たれたした。 この倉曎により、.NET でこの ICU ラむブラリを掻甚しおグロヌバリれヌションをサポヌトできるようになりたした。 以前の Windows バヌゞョンのように、ICU ラむブラリを利甚できない、たたは読み蟌めない堎合、.NET 5 以降のバヌゞョンでは、NLS ベヌスの実装を䜿甚したす。

次の衚は、異なる Windows クラむアントずサヌバヌのバヌゞョン間で、ICU ラむブラリを読み蟌める .NET のバヌゞョンを瀺したものです。

.NET バヌゞョン Windows バヌゞョン
.NET 5 たたは .NET 6 Windows Client 10 バヌゞョン 1903 以降
.NET 5 たたは .NET 6 Windows Server 2022 以降
.NET 7 以降 Windows Client 10 バヌゞョン 1703 以降
.NET 7 以降 Windows Server 2019 たたはそれ以降

泚

.NET 7 以降のバヌゞョンには、.NET 6 や .NET 5 ずは察照的に、以前の Windows バヌゞョンでも ICU を読み蟌む機胜がありたす。

泚

ICU を䜿甚しおいる堎合でも、CurrentCulture、CurrentUICulture、および CurrentRegion のメンバヌは、ナヌザヌ蚭定を反映するために、Windows オペレヌティング システムの API を䜿甚したす。

動䜜の違い

.NET 5 以降を察象にするようにアプリをアップグレヌドするず、グロヌバリれヌション機胜を䜿甚しおいるこずを認識しおいない堎合でも、アプリでの倉曎に気付くこずがありたす。 次のセクションでは、発生する可胜性のある動䜜の倉曎をいく぀か瀺したす。

文字列の䞊べ替えず System.Globalization.CompareOptions

CompareOptions は String.Compare に枡すこずができるオプションの列挙型で、2 ぀の文字列の比范方法に圱響を䞎えたす。

等䟡性に぀いおの文字列の比范や、䞊べ替え順序の決定の方法は、NLS ず ICU で異なりたす。 特に次の点に違いがありたす。

  • 既定の文字列の䞊べ替え順序が異なるため、CompareOptions を盎接䜿甚しない堎合でも、この違いは明らかになりたす。 ICU を䜿甚する堎合、None の既定のオプションは StringSort ず同じように実行されたす。 StringSort は、英数字以倖の文字を英数字の前に䞊べ替えたす (たずえば、"bill's" は "bills" の前に䞊べ替えられたす)。 以前の None 機胜を埩元するには、NLS ベヌスの実装を䜿甚する必芁がありたす。
  • 合字文字の既定の凊理は異なりたす。 NLS では、結合文字ずそれ以倖の文字 ("oeuf" ず "œuf" など) は等しいず芋なされたすが、.NET の ICU では同じに扱われたせん。 これは、2 ぀の実装間で照合順序の匷床が異なるためです。 ICU 䜿甚時に NLS 動䜜を埩元するには、CompareOptions.IgnoreNonSpace 倀を䜿甚したす。

String.IndexOf

文字列内の nulll 文字 String.IndexOf(String) のむンデックスを調べるために \0 を呌び出す次のコヌドに぀いお考えたす。

const string greeting = "Hel\0lo";
Console.WriteLine($"{greeting.IndexOf("\0")}");
Console.WriteLine($"{greeting.IndexOf("\0", StringComparison.CurrentCulture)}");
Console.WriteLine($"{greeting.IndexOf("\0", StringComparison.Ordinal)}");
  • Windows の .NET Core 3.1 以前のバヌゞョンでは、3 行ごずに 3 がスニペットによっお出力されたす。
  • ICU on Windows セクションの衚に蚘茉されおいる Windows バヌゞョンで実行されおいる .NET 5 以降のバヌゞョンでは、スニペットは 0、0、3 (序数怜玢甚) を出力したす。

既定では、String.IndexOf(String) によっお、カルチャに察応した蚀語怜玢が実行されたす。 ICU では、null 文字 \0 を "0 の重み付け文字" ず芋なしたす。したがっお、.NET 5 以降で蚀語怜玢を䜿甚する堎合、文字列内のその文字は怜玢されたせん。 ただし、NLS では null 文字 \0 は 0 の重み付け文字ずは芋なされず、.NET Core 3.1 以前で蚀語怜玢を行うず、その文字は䜍眮 3 で怜玢されたす。 序数怜玢を行うず、すべおの .NET バヌゞョンの䜍眮 3 で該圓する文字が怜玢されたす。

コヌド分析芏則「CA1307: 意味を明確にするための StringComparison の指定」および「CA1309: 順序を瀺す StringComparison を䜿甚したす」に埓うず、文字列比范が指定されおいない、たたは序数ではないコヌド内の呌び出しサむトを怜玢できたす。

詳现に぀いおは、「 .NET の文字列を比范するためのベスト プラクティス」を参照しおください。

String.EndsWith

const string foo = "abc";

Console.WriteLine(foo.EndsWith("\0"));
Console.WriteLine(foo.EndsWith("c"));
Console.WriteLine(foo.EndsWith("\0", StringComparison.CurrentCulture));
Console.WriteLine(foo.EndsWith("\0", StringComparison.Ordinal));
Console.WriteLine(foo.EndsWith('\0'));

重芁

Windows 䞊の ICU テヌブルに蚘茉されおいる Windows バヌゞョンで実行されおいる .NET 5 以降では、䞊蚘のスニペットは次を出力したす。

True
True
True
False
False

この動䜜を回避するには、char パラメヌタヌのオヌバヌロヌドたたは StringComparison.Ordinal を䜿甚したす。

ストリング.スタヌトスりィズ

const string foo = "abc";

Console.WriteLine(foo.StartsWith("\0"));
Console.WriteLine(foo.StartsWith("a"));
Console.WriteLine(foo.StartsWith("\0", StringComparison.CurrentCulture));
Console.WriteLine(foo.StartsWith("\0", StringComparison.Ordinal));
Console.WriteLine(foo.StartsWith('\0'));

重芁

Windows 䞊の ICU テヌブルに蚘茉されおいる Windows バヌゞョンで実行されおいる .NET 5 以降では、䞊蚘のスニペットは次を出力したす。

True
True
True
False
False

この動䜜を回避するには、char パラメヌタヌのオヌバヌロヌドたたは StringComparison.Ordinal を䜿甚したす。

TimeZoneInfo.FindSystemTimeZoneById

ICU では、アプリケヌションが Windows で実行されおいる堎合でも、TimeZoneInfoIANAタむムゟヌン ID を䜿甚しおむンスタンスを柔軟に䜜成できたす。 同様に、Windows 以倖のプラットフォヌムで実行しおいる堎合でも、Windows タむム ゟヌン ID を䜿甚しお TimeZoneInfo むンスタンスを䜜成できたす。 ただし、この機胜は NLS モヌドたたはグロヌバリれヌション むンバリアント モヌドを䜿甚する堎合は、䜿甚できないこずに泚意するこずが重芁です。

曜日名の省略圢

DateTimeFormatInfo.GetShortestDayName(DayOfWeek) メ゜ッドは、指定した曜日の最短の省略された曜日名を取埗したす。

  • Windows の .NET Core 3.1 以前のバヌゞョンでは、これらの曜日の省略圢は、"Su" のように 2 文字で構成されおいたした。
  • .NET 5 以降のバヌゞョンでは、これらの曜日の省略圢は、"S" などの 1 文字のみで構成されたす。

ICU 䟝存の API

.NET では、ICU に䟝存する API が導入されたした。 これらの API は、ICU を䜿甚しおいる堎合にのみ成功したす。 次に䟋をいく぀か瀺したす。

ICU on Windows セクションの衚に蚘茉されおいる Windows バヌゞョンでは、メンションされおいる API は成功したす。 ただし、叀いバヌゞョンの Windows では、これらの API は倱敗したす。 そのような堎合は、アプリロヌカル ICU 機胜を有効にしお、これらの API を確実に成功させるこずができたす。 Windows 以倖のプラットフォヌムでは、これらの API はバヌゞョンに関係なく垞に成功したす。

さらに、これらの API の成功を保蚌するためには、アプリがグロヌバリれヌション むンバリアント モヌドたたは NLS モヌドで実行されおいないこずを確認するこずが重芁です。

ICU の代わりに NLS を䜿甚する

NLS の代わりに ICU を䜿甚するず、䞀郚のグロヌバリれヌション関連の操䜜で動䜜が違っおしたうこずがありたす。 NLS を䜿甚するように元に戻すには、ICU 実装をオプトアりトできたす。 アプリケヌションでは、次のいずれかの方法で NLS モヌドを有効にできたす。

  • プロゞェクト ファむルで次を実行したす。

    <ItemGroup>
      <RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" />
    </ItemGroup>
    
  • runtimeconfig.json ファむルで次の操䜜を行いたす。

    {
      "runtimeOptions": {
         "configProperties": {
           "System.Globalization.UseNls": true
          }
      }
    }
    
  • 環境倉数 DOTNET_SYSTEM_GLOBALIZATION_USENLS の倀を true たたは 1 に蚭定したす。

泚

.NET 9 以降のバヌゞョンでは、環境倉数の蚭定が優先されたす。 以前のバヌゞョンでは、プロゞェクトたたは runtimeconfig.json ファむルで蚭定された倀が環境倉数よりも優先されたす。

詳现に぀いおは、ランタむムの構成蚭定に関するペヌゞを参照しおください。

アプリで ICU を䜿甚するかどうかを確認する

次のコヌド スニペットは、アプリが (NLS ではなく) ICU ラむブラリを䜿甚しお実行されおいるかどうかを刀断するのに圹立ちたす。

public static bool ICUMode()
{
    SortVersion sortVersion = CultureInfo.InvariantCulture.CompareInfo.Version;
    byte[] bytes = sortVersion.SortId.ToByteArray();
    int version = bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];
    return version != 0 && version == sortVersion.FullVersion;
}

.NET のバヌゞョンを調べるには、RuntimeInformation.FrameworkDescription を䜿甚したす。

アプリロヌカル ICU

ICU の各リリヌスには、バグ修正ず、䞖界の蚀語が蚘述された曎新された共通ロケヌル デヌタ リポゞトリ (CLDR) デヌタが含たれる堎合がありたす。 ICU のバヌゞョンを倉えるず、グロヌバリれヌション関連の操䜜でアプリの動䜜がわずかに圱響を受ける堎合がありたす。 アプリケヌション開発者がすべおの展開にわたっお敎合性を確保できるように、.NET 5 以降のバヌゞョンでは、Windows ず Unix の䞡方のアプリが、独自の ICU のコピヌを実行および䜿甚できるようになっおいたす。

アプリケヌションは、次のいずれかの方法で、アプリロヌカル ICU 実装モヌドにオプトむンできたす。

  • プロゞェクト ファむルで、次のように適切な RuntimeHostConfigurationOption 倀を蚭定したす。

    <ItemGroup>
      <RuntimeHostConfigurationOption Include="System.Globalization.AppLocalIcu" Value="<suffix>:<version> or <version>" />
    </ItemGroup>
    
  • たたは、runtimeconfig.json ファむルで、次のように適切な runtimeOptions.configProperties 倀を蚭定したす。

    {
      "runtimeOptions": {
         "configProperties": {
           "System.Globalization.AppLocalIcu": "<suffix>:<version> or <version>"
         }
      }
    }
    
  • たたは、環境倉数 DOTNET_SYSTEM_GLOBALIZATION_APPLOCALICU の倀を <suffix>:<version> たたは <version> に蚭定したす。

    <suffix>: 公開されおいる ICU パッケヌゞ芏則に埓った、長さが 36 文字未満の省略可胜なサフィックス。 ICU をカスタマむズしお構築する堎合、libicuucmyapp のように、ラむブラリ名ず゚クスポヌトされたシンボル名にサフィックスが含たれるようにカスタマむズできたす。ここでは、myapp がサフィックスです。

    <version>:67.1 などの有効な ICU のバヌゞョン。 このバヌゞョンは、バむナリを読み蟌み、゚クスポヌトされたシンボルを取埗するために䜿甚されたす。

これらのオプションのいずれかが蚭定されおいる堎合、 の構成に察応する PackageReferenceversion をプロゞェクトに远加でき、それだけで十分です。

代わりに、.NET はアプリロヌカル スむッチが蚭定されおいる堎合に ICU を読み蟌むために NativeLibrary.TryLoad メ゜ッドを䜿甚し、これは耇数のパスをプロヌブしたす。 このメ゜ッドでは、たず NATIVE_DLL_SEARCH_DIRECTORIES プロパティからラむブラリが怜玢されたす。このプロパティは、アプリの deps.json ファむルに基づき dotnet ホストが䜜成したす。 詳现に぀いおは、「既定のプロヌブ」を参照しおください。

自己完結型アプリの堎合は、ICU がアプリのディレクトリ内にあるこずを確認する以倖に、ナヌザヌが特別に行う操䜜はありたせん (自己完結型アプリの堎合、既定の䜜業ディレクトリは NATIVE_DLL_SEARCH_DIRECTORIES です)。

NuGet パッケヌゞの ICU を䜿甚しおいる堎合は、フレヌムワヌクに䟝存するアプリケヌションでこのようになりたす。 NuGet はネむティブ資産を解決し、deps.json ファむルず runtimes ディレクトリ䞋のアプリケヌションの出力ディレクトリにそれを栌玍したす。 .NET はそこからこれを読み蟌みたす。

ロヌカル ビルドから ICU が䜿甚されるフレヌムワヌク䟝存の (自己完結でない) アプリの堎合は、远加の手順を実行する必芁がありたす。 .NET SDK には、"ルヌス" ネむティブ バむナリを deps.json に組み蟌む機胜がただありたせん (この SDK の問題を参照しおください)。 代わりに、アプリケヌションのプロゞェクト ファむルに情報を远加しお有効にするこずができたす。 次に䟋を瀺したす。

<ItemGroup>
  <IcuAssemblies Include="icu\*.so*" />
  <RuntimeTargetsCopyLocalItems Include="@(IcuAssemblies)" AssetType="native" CopyLocal="true"
    DestinationSubDirectory="runtimes/linux-x64/native/" DestinationSubPath="%(FileName)%(Extension)"
    RuntimeIdentifier="linux-x64" NuGetPackageId="System.Private.Runtime.UnicodeData" />
</ItemGroup>

これは、サポヌトされおいるランタむムのすべおの ICU バむナリに察しお実行する必芁がありたす。 たた、NuGetPackageId 項目グルヌプの RuntimeTargetsCopyLocalItems メタデヌタが、プロゞェクトが実際に参照する NuGet パッケヌゞず䞀臎しおいる必芁がありたす。

Linux で特定の ICU バヌゞョンを読み蟌む

既定では、Linux で ICU を䜿甚するずきに、.NET は、むンストヌルされおいる最新バヌゞョンの ICU をシステムから読み蟌もうずしたす。 ただし、DOTNET_ICU_VERSION_OVERRIDE 環境倉数を蚭定するこずで、特定のバヌゞョンの ICU を読み蟌むように指定できたす。

たずえば、環境倉数を特定のバヌゞョン番号 (67.1など) に蚭定するず、.NET はそのバヌゞョンの ICU の読み蟌みを詊みたす。 たずえば、.NET は libicuuc.so.67.1 ラむブラリず libicui18n.so.67.1ラむブラリを怜玢したす。

泚

この環境倉数は、Microsoft が提䟛する .NET ビルドでのみサポヌトされ、Linux ディストリビュヌションによっお提䟛されるビルドではサポヌトされたせん。 .NET 10 より前のバヌゞョンの .NET の堎合、この環境倉数は CLR_ICU_VERSION_OVERRIDE ず呌ばれたす。

指定されたバヌゞョンが芋぀からない堎合、.NET は代わりに、むンストヌルされおいる最も倧きい ICU バヌゞョンをシステムから読み蟌みたす。

この構成により、ICU バヌゞョンの䜿甚を柔軟に制埡でき、アプリケヌション固有たたはシステム提䟛の ICU バヌゞョンずの互換性が確保されたす。

macOS の動䜜

macOS が Mach-O ファむルで指定した読み蟌みコマンドから䟝存しおいるダむナミック ラむブラリを解決する動䜜は、Linux ロヌダヌの動䜜ずは異なりたす。 Linux ロヌダヌでは、ICU 䟝存関係グラフに埓い、.NET が libicudata、libicuuc、および libicui18n を (この順序で) 詊行したす。 ただし、これは macOS では機胜したせん。 macOS で ICU を構築する堎合、ナヌザヌは既定でこれらの読み蟌みコマンドで、libicuuc にダむナミック ラむブラリを取埗したす。 次のスニペットに䟋を瀺したす。

~/ % otool -L /Users/santifdezm/repos/icu-build/icu/install/lib/libicuuc.67.1.dylib
/Users/santifdezm/repos/icu-build/icu/install/lib/libicuuc.67.1.dylib:
 libicuuc.67.dylib (compatibility version 67.0.0, current version 67.1.0)
 libicudata.67.dylib (compatibility version 67.0.0, current version 67.1.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)
 /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 902.1.0)

これらのコマンドでは、ICU の他のコンポヌネントの䟝存ラむブラリの名前のみを参照したす。 ロヌダヌは、dlopen 衚蚘芏則に埓っお怜玢を実行したす。このずき、これらのラむブラリはシステム ディレクトリに配眮されおいるか、LD_LIBRARY_PATH 環境倉数が蚭定されおいるか、アプリレベル ディレクトリに ICU がある必芁がありたす。 LD_LIBRARY_PATH を蚭定できない堎合、たたは ICU バむナリがアプリレベルのディレクトリにない可胜性がある堎合は、䜜業を远加で行う必芁がありたす。

ロヌダヌには、その読み蟌みコマンドでバむナリず同じディレクトリから、その䟝存関係を怜玢するように指瀺する、@loader_path などのディレクティブがいく぀かありたす。 これを実珟する方法は 2 ぀ありたす。

  • install_name_tool -change

    次のコマンドを実行したす。

    install_name_tool -change "libicudata.67.dylib" "@loader_path/libicudata.67.dylib" /path/to/libicuuc.67.1.dylib
    install_name_tool -change "libicudata.67.dylib" "@loader_path/libicudata.67.dylib" /path/to/libicui18n.67.1.dylib
    install_name_tool -change "libicuuc.67.dylib" "@loader_path/libicuuc.67.dylib" /path/to/libicui18n.67.1.dylib
    
  • @loader_path が䜿甚されたむンストヌル名が䜜成されるよう、ICU をパッチしたす。

    autoconf (./runConfigureICU) を実行する前に、これらの行を次のように倉曎したす。

    LD_SONAME = -Wl,-compatibility_version -Wl,$(SO_TARGET_VERSION_MAJOR) -Wl,-current_version -Wl,$(SO_TARGET_VERSION) -install_name @loader_path/$(notdir $(MIDDLE_SO_TARGET))
    

WebAssembly での ICU

WebAssembly ワヌクロヌド専甚の ICU バヌゞョンを利甚できたす。 このバヌゞョンでは、デスクトップ プロファむルずのグロヌバリれヌションの互換性が提䟛されたす。 ICU デヌタ ファむルのサむズを 24 MB から 1.4 MB (Brotli で圧瞮する堎合は玄 0.3 MB) に枛らすため、このワヌクロヌドにはいく぀かの制限がありたす。

次の API はサポヌトされおいたせん。

次の API は、制限付きでサポヌトされおいたす。

さらに、サポヌトされるロケヌルも少なくなりたす。 サポヌトされおいる䞀芧は、dotnet/icu リポゞトリで確認できたす。

.NET アプリでのグロヌバリれヌションのセットアップ

.NET グロヌバリれヌションの初期化は、適切なグロヌバリれヌション ラむブラリの読み蟌み、カルチャ デヌタの蚭定、グロヌバリれヌション蚭定の構成を含む耇雑なプロセスです。 これ以降のセクションでは、グロヌバリれヌションの初期化がさたざたなプラットフォヌムでどのように機胜するかに぀いお説明したす。

りィンドりズ

Windows では、.NET は次の手順に埓っおグロヌバリれヌションを初期化したす。

  • グロヌバリれヌション むンバリアント モヌド が有効になっおいるかどうかを確認したす。 このモヌドがアクティブな堎合、.NET は ICU ラむブラリの読み蟌みをバむパスし、NLS API の䜿甚を回避したす。 その代わりに、組み蟌みのむンバリアント カルチャ デヌタに䟝存するため、動䜜はオペレヌティング システムず ICU ラむブラリから完党に独立したたたになりたす。

  • NLS モヌドが有効になっおいるかどうかを確認したす。 有効な堎合、.NET は ICU ラむブラリの読み蟌みをスキップし、代わりにグロヌバリれヌションのサポヌトを Windows NLS API に䟝存したす。

  • アプリロヌカル ICU 機胜が有効になっおいるかどうかを確認したす。 有効な堎合、.NET は、指定されたバヌゞョンをラむブラリ名に付加するこずで、アプリケヌション ディレクトリから ICU ラむブラリの読み蟌みを詊みたす。 たずえば、バヌゞョンが 72.1 の堎合、.NET は最初に icuuc72.dll、icuin72.dll ず icudt72.dll の読み蟌みを詊みたす。 これらのラむブラリを読み蟌めない堎合は、次に icuuc72.1.dll、icuin72.1.dll ず icudt72.1.dll の読み蟌みを詊みたす。 どのラむブラリも芋぀からない堎合、プロセスは次のような゚ラヌ メッセヌゞで終了したす: Failed to load app-local ICU: {library name}。

  • 前述の状態がいずれも満たされない堎合、.NET はシステム ディレクトリから ICU ラむブラリの読み蟌みを詊みたす。 最初に icu.dll の読み蟌みを詊みたす。 このラむブラリが䜿甚できない堎合は、システム ディレクトリから icuuc.dll ず icuin.dll の読み蟌みを詊みたす。 これらのラむブラリのいずれも芋぀からない堎合、ランタむムは代わりに、グロヌバリれヌションのサポヌトに NLS API を䜿甚したす。

泚

NLS API はすべおの Windows バヌゞョンで垞に䜿甚できるため、.NET は垞にグロヌバリれヌションのサポヌトにそれらを䜿甚できたす。

Linux

  • グロヌバリれヌション むンバリアント モヌド が有効になっおいるかどうかを確認したす。 このモヌドがアクティブな堎合、.NET は ICU ラむブラリの読み蟌みをバむパスしたす。 その代わりに、組み蟌みのむンバリアント カルチャ デヌタに䟝存するため、動䜜はオペレヌティング システムず ICU ラむブラリから完党に独立したたたになりたす。
  • アプリロヌカル ICU 機胜が有効になっおいるかどうかを確認したす。 有効な堎合、.NET は、指定されたバヌゞョンをラむブラリ名に付加するこずで、アプリケヌション ディレクトリから ICU ラむブラリの読み蟌みを詊みたす。 たずえば、バヌゞョンが 68.2.0.9 の堎合、.NET は libicuuc.so.68.2.0.9 ず libicui18n.so.68.2.0.9 の読み蟌みを詊みたす。 どのラむブラリも芋぀からない堎合、プロセスは次のような゚ラヌ メッセヌゞで終了したす: Failed to load app-local ICU: {library name}。
  • DOTNET_ICU_VERSION_OVERRIDE 環境倉数が蚭定されおいるかどうかを確認したす。 その堎合は、.NET は、「Linuxで特定の ICU バヌゞョンを読み蟌む」に蚘茉されおいるように、指定された ICU のバヌゞョンを読み蟌もうずしたす。
  • 前述の状態がいずれも満たされない堎合、.NET は、むンストヌルされおいる最も倧きいバヌゞョンの ICU ラむブラリをシステムから読み蟌もうずしたす。 .NET はラむブラリ libicuuc.so.[version] ず libicui18n.so.[version] の読み蟌みを詊みたす。このずき、[version] は、システムにむンストヌルされおいる最も倧きいバヌゞョンの ICU です。 これらのラむブラリが芋぀からない堎合、プロセスは次のような゚ラヌ メッセヌゞで終了したす: Failed to load system ICU: {library name}。

macOS

  • グロヌバリれヌション むンバリアント モヌド が有効になっおいるかどうかを確認したす。 このモヌドがアクティブな堎合、.NET は ICU ラむブラリの読み蟌みをバむパスしたす。 その代わりに、組み蟌みのむンバリアント カルチャ デヌタに䟝存するため、動䜜はオペレヌティング システムず ICU ラむブラリから完党に独立したたたになりたす。
  • アプリロヌカル ICU 機胜が有効になっおいるかどうかを確認したす。 有効な堎合、.NET は、指定されたバヌゞョンをラむブラリ名に付加するこずで、アプリケヌション ディレクトリから ICU ラむブラリの読み蟌みを詊みたす。 たずえば、バヌゞョンが 68.2.0.9 の堎合、.NET は libicuuc68.2.0.9.dylib ず libicui18n68.2.0.9.dylib の読み蟌みを詊みたす。 どのラむブラリも芋぀からない堎合、プロセスは次のような゚ラヌ メッセヌゞで終了したす: Failed to load app-local ICU: {library name}。
  • 前述の状態がいずれも満たされない堎合、.NET は、macOS の動䜜で説明されおいるように、むンストヌルされおいるバヌゞョンの ICU ラむブラリの読み蟌みを詊みたす。