Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
.NET 5'in öncesinde .NET genelleştirme API'leri farklı platformlarda farklı temel kitaplıklar kullanıyordu. Unix'te, API'ler Unicode için Uluslararası Bileşenler (ICU) ve Windows'da Ulusal Dil Desteği (NLS) kullandı. Bu, uygulamaları farklı platformlarda çalıştırırken birkaç genelleştirme API'sinde bazı davranış farklılıklarına neden oldu. Davranış farklılıkları şu alanlarda belirgindi:
- Kültürler ve kültür verileri
- Dize harf biçimlendirme
- Dize sıralama ve arama
- Sıralama tuşları
- Dize normalleştirme
- Uluslararası Etki Alanı Adları (IDN) desteği
- Linux'ta saat dilimi görüntüleme adı
.NET 5'den başlayarak, geliştiriciler hangi temel kitaplığın kullanıldığı üzerinde daha fazla denetime sahip olur ve uygulamaların platformlar arasındaki farkları önlemesine olanak tanır.
Not
ICU kitaplığının davranışını sürdürmeye yönelik kültür verileri genellikle çalışma zamanı yerine Common Locale Data Repository (CLDR) tarafından korunur.
Windows'ta ICU
Windows artık genelleştirme görevleri için otomatik olarak kullanılan özelliklerinin bir parçası olarak önceden yüklenmiş bir icu.dll sürümü içerir. Bu değişiklik, .NET'in genelleştirme desteği için bu ICU kitaplığını kullanmasına olanak tanır. Eski Windows sürümlerinde olduğu gibi, ICU kitaplığının kullanılamadığı veya yüklenemediği durumlarda, .NET 5 ve sonraki sürümler NLS tabanlı uygulamayı kullanmaya geri döner.
Aşağıdaki tabloda, hangi .NET sürümlerinin farklı Windows istemci ve sunucu sürümleri arasında ICU kitaplığını yükleyebilecekleri gösterilmektedir:
| .NET sürümü | Windows sürümü |
|---|---|
| .NET 5 veya .NET 6 | Windows istemci 10 sürüm 1903 veya üzeri |
| .NET 5 veya .NET 6 | Windows Server 2022 veya üzeri |
| .NET 7 veya üzeri | Windows istemci 10 sürüm 1703 veya üzeri |
| .NET 7 veya üzeri | Windows Server 2019 veya üzeri |
Not
.NET 7 ve sonraki sürümleri, .NET 6 ve .NET 5'in aksine eski Windows sürümlerine ICU yükleme özelliğine sahiptir.
Not
ICU kullanırken bile, CurrentCulture, CurrentUICultureve CurrentRegion üyeleri kullanıcı ayarlarını yerine getirmek için Windows işletim sistemi API'lerini kullanmaya devam etmektedir.
Davranış farklılıkları
Uygulamanızı .NET 5 veya sonraki bir sürümü hedefleye yükseltirseniz, genelleştirme olanaklarını kullandığınızı fark etmeseniz bile uygulamanızda değişiklikler görebilirsiniz. Aşağıdaki bölümde karşılaşabileceğiniz bazı davranış değişiklikleri listelenir.
Dize sıralama ve System.Globalization.CompareOptions
CompareOptions , iki dizenin karşılaştırılma şeklini etkilemek için String.Compare geçirilebilen seçenekler sabit listesidir.
Eşitlik için dizeleri karşılaştırmak ve sıralama düzenlerini belirlemek NLS ile ICU arasında farklılık gösterir. Özellikle:
- Varsayılan dize sıralama düzeni farklıdır, bu nedenle doğrudan kullanmasanız
CompareOptionsbile bu durum görünür. ICU kullanılırken,Nonevarsayılan seçenek ileStringSortaynı işlemi gerçekleştirir.StringSortalfasayısal olmayan karakterleri alfasayısal karakterlerden önce sıralar (dolayısıyla "bill'in" "biller"den önce sıralanır, örneğin). ÖncekiNoneişlevselliği geri yüklemek için NLS tabanlı uygulamayı kullanmanız gerekir. - Ligatür karakterlerinin varsayılan işlemesi farklıdır. NLS'nin altında ligatürler ve ligatür olmayan karşılıkları (örneğin, "oeuf" ve "œuf") eşit kabul edilir, ancak .NET'te ICU'da bu durum geçerli değildir. Bunun nedeni, iki uygulama arasındaki farklı harmanlama gücüdür. ICU kullanırken NLS davranışını geri yüklemek için, `
CompareOptions.IgnoreNonSpace` değerini kullanın.
String.IndexOf (dize içinde konum bulma)
Aşağıdaki kod, String.IndexOf(String) çağrılarak bir dizideki null karakterin \0 dizinini bulur.
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'un .NET Core 3.1 ve önceki sürümlerinde, kod parçacığı üç satırın her birinde
3yazdırır. - Windows'daki ICU bölüm tablosunda listelenen Windows sürümlerinde çalışan .NET 5 ve ileri sürümler için kod parçacığı,
0,0ve3(sıralı arama için) yazdırır.
Varsayılan olarak, String.IndexOf(String) kültüre duyarlı bir dil araması gerçekleştirir. ICU, null karakteri sıfır ağırlıklı bir karakter \0olarak kabul eder ve bu nedenle .NET 5 ve sonraki sürümlerde dil araması kullanılırken karakter dizede bulunmaz. Ancak, NLS null karakteri sıfır ağırlıklı bir karakter \0 olarak değerlendirmez ve .NET Core 3.1 ve önceki sürümlerde dilsel bir arama 3 konumundaki karakteri bulur. Sıralı arama, tüm .NET sürümlerinde 3 konumundaki karakteri bulur.
Kod çözümleme kurallarını CA1307: Netlik için StringComparison belirtin ve CA1309: Sıralı StringComparison kullanın çalıştırarak, kodunuzda dize karşılaştırmasının belirtilmediği veya sıralı olmadığı çağrı yerlerini bulabilirsiniz.
Daha fazla bilgi için bkz. .NET'te dizeleri karşılaştırmak için en iyi yöntemler.
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'));
Önemli
Windows'da ICU tablosunda listelenen Windows sürümlerinde çalışan .NET 5+ sürümünde, yukarıdaki kod parçacığı yazdırılır:
True
True
True
False
False
Bu davranışı önlemek için char parametre aşırı yüklemesini veya StringComparison.Ordinal kullanın.
String.StartsWith
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'));
Önemli
Windows'da ICU tablosunda listelenen Windows sürümlerinde çalışan .NET 5+ sürümünde, yukarıdaki kod parçacığı yazdırılır:
True
True
True
False
False
Bu davranışı önlemek için char parametre aşırı yüklemesini veya StringComparison.Ordinal kullanın.
TimeZoneInfo.FindSystemTimeZoneById
ICU, uygulama Windows üzerinde çalışırken bile IANA zaman dilimlerini kullanarak TimeZoneInfo örnekleri oluşturma esnekliği sağlar. Benzer şekilde, Windows dışı platformlarda çalışırken bile Windows saat dilimi kimlikleriyle örnekler oluşturabilirsiniz TimeZoneInfo . Ancak, NLS modu veya genelleştirme sabit modu kullanılırken bu işlevselliğin kullanılamadığını unutmayın.
Haftanın günleri kısaltmaları
yöntemi, DateTimeFormatInfo.GetShortestDayName(DayOfWeek) haftanın belirtilen günü için en kısa kısaltılmış gün adını alır.
- Windows'un .NET Core 3.1 ve önceki sürümlerinde, bu haftanın günü kısaltmaları iki karakterden oluşuyordu, örneğin, "Su".
- .NET 5 ve sonraki sürümlerinde, bu haftanın günü kısaltmaları yalnızca bir karakterden oluşur; örneğin, "S".
ICU'ya bağımlı API'ler
.NET, ICU'ya bağımlı API'leri kullanıma sunar. Bu API'ler yalnızca ICU kullanılırken başarılı olabilir. Burada bazı örnekler verilmiştir:
Windows'da ICU bölüm tablosunda listelenen Windows sürümlerinde, bahsedilen API'ler başarılı olur. Ancak, Windows'un eski sürümlerinde bu API'ler başarısız olur. Bu gibi durumlarda, bu API'lerin başarısını sağlamak için uygulama yerel ICU özelliğini etkinleştirebilirsiniz. Windows olmayan platformlarda, bu API'ler sürümden bağımsız olarak her zaman başarılı olur.
Ayrıca, uygulamaların bu API'lerin başarısını garanti etmek için genelleştirme sabit modunda veya NLS modunda çalışmadığından emin olmaları çok önemlidir.
ICU yerine NLS kullanma
NLS yerine ICU kullanılması, genelleştirmeyle ilgili bazı işlemlerle davranış farklılıklarına neden olabilir. NLS kullanmaya geri dönmek için ICU uygulamasını geri çevirebilirsiniz. Uygulamalar NLS modunu aşağıdaki yollardan herhangi biriyle etkinleştirebilir:
Proje dosyasında:
<ItemGroup> <RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" /> </ItemGroup>runtimeconfig.jsondosyasında:{ "runtimeOptions": { "configProperties": { "System.Globalization.UseNls": true } } }Ortam değişkenini
DOTNET_SYSTEM_GLOBALIZATION_USENLSveyatruedeğerine1ayarlayarak.
Not
.NET 9 ve sonraki sürümlerde ortam değişkeni ayarı önceliklidir. Önceki sürümlerde, projede veya dosyada runtimeconfig.json ayarlanan bir değer ortam değişkenine göre önceliklidir.
Daha fazla bilgi için bkz . Çalışma zamanı yapılandırma ayarları.
Uygulamanızın ICU kullanıp kullanmadığını belirleme
Aşağıdaki kod parçacığı, uygulamanızın NLS değil, ICU kitaplıklarıyla çalışıp çalışmadığını belirlemenize yardımcı olabilir.
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 sürümünü belirlemek için kullanın RuntimeInformation.FrameworkDescription.
Uygulamaya özel ICU
ICU'nun her sürümü hata düzeltmeleri getirebilir ve dünyanın dillerini açıklayan Common Locale Data Repository (CLDR) verilerini güncelleştirebilir. ICU sürümleri arasında geçiş yapmak, genelleştirmeyle ilgili işlemler söz konusu olduğunda uygulama davranışını olumsuz etkileyebilir. .NET 5 ve üzeri sürümler, uygulama geliştiricilerinin tüm dağıtımlarda tutarlılık sağlamasına yardımcı olmak için hem Windows hem de Unix'te uygulamaların kendi ICU kopyalarını taşımasına ve kullanmasına olanak tanır.
Uygulamalar, aşağıdaki yollardan biriyle uygulama yerel ICU uygulama modunu kabul edebilir:
Proje dosyasında uygun
RuntimeHostConfigurationOptiondeğeri ayarlayın:<ItemGroup> <RuntimeHostConfigurationOption Include="System.Globalization.AppLocalIcu" Value="<suffix>:<version> or <version>" /> </ItemGroup>veya runtimeconfig.json dosyasında uygun
runtimeOptions.configPropertiesdeğeri ayarlayın:{ "runtimeOptions": { "configProperties": { "System.Globalization.AppLocalIcu": "<suffix>:<version> or <version>" } } }Ya da ortam değişkenini
DOTNET_SYSTEM_GLOBALIZATION_APPLOCALICUveya<suffix>:<version>değerine<version>ayarlayarak.<suffix>: Genel ICU paketleme kurallarına göre 36 karakterden daha az uzunlukta isteğe bağlı sonek. Özel bir ICU oluştururken, bunu özelleştirerek lib adlarını ve dışarı aktarılan simge adlarını sonek (örneğin,libicuucmyapp) içerecek şekilde oluşturabilirsiniz; buradamyappsonektir.<version>: Geçerli bir ICU sürümü, örneğin, 67.1. Bu sürüm ikili dosyaları yüklemek ve dışarı aktarılan simgeleri almak için kullanılır.
Bu seçeneklerden biri ayarlandığında, yapılandırılmış ayara karşılık gelen ve ihtiyacınız olan tek şey olan Microsoft.ICU.ICU4C.Runtime'ı projenize ekleyebilirsiniz.
Alternatif olarak, uygulama yerel anahtarı ayarlandığında ICU'yu yüklemek için .NET, birden çok yolu sorgulayan NativeLibrary.TryLoad yöntemini kullanır. Yöntem, ilk olarak NATIVE_DLL_SEARCH_DIRECTORIES dosyasına dayalı olarak dotnet konağı tarafından oluşturulan deps.json özelliğinde kitaplığı bulmaya çalışır. Daha fazla bilgi için bkz. Varsayılan yoklama.
Bağımsız uygulamalar için, kullanıcı tarafından ICU'nın uygulama dizininde olduğundan emin olmak dışında özel bir eylem gerekmez (bağımsız uygulamalar için, çalışma dizini varsayılan olarak NATIVE_DLL_SEARCH_DIRECTORIESolarak olur).
NuGet paketi aracılığıyla ICU kullanıyorsanız bu, çerçeveye bağımlı uygulamalarda çalışır. NuGet, yerel varlıkları çözümler ve bunları dosya deps.json içine ve uygulamanın runtimes dizinindeki çıkış dizinine ekler. .NET buradan yükler.
Yerel bir derlemeden ICU kullanılan çerçeveye bağımlı uygulamalar (bağımsız olmayan) için ek adımlar atmalısınız. .NET SDK'sının henüz içine eklenecek deps.json "gevşek" yerel ikili dosyalar için bir özelliği yoktur (bu SDK sorununa bakın). Bunun yerine, uygulamanın proje dosyasına ek bilgiler ekleyerek bunu etkinleştirebilirsiniz. Örneğin:
<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>
Desteklenen çalışma zamanları için tüm ICU ikili dosyalarının her biri için bu yapılmalıdır. Ayrıca, NuGetPackageId öğe grubundaki RuntimeTargetsCopyLocalItems meta verilerin projenin gerçekten başvurduğunu bir NuGet paketiyle eşleşmesi gerekir.
Linux'ta belirli ICU sürümünü yükleme
Varsayılan olarak, Linux'ta ICU kullanılırken .NET, sistemden yüklü en son ICU sürümünü yüklemeyi dener. Ancak, DOTNET_ICU_VERSION_OVERRIDE ortam değişkenini ayarlayarak yüklenecek belirli bir ICU sürümü belirtebilirsiniz.
Örneğin, ortam değişkeni 67.1gibi belirli bir sürüm numarasına ayarlanırsa .NET bu ICU sürümünü yüklemeyi dener. Örneğin, .NET libicuuc.so.67.1 ve libicui18n.so.67.1kitaplıklarını arar.
Not
Bu ortam değişkeni yalnızca Microsoft tarafından sağlanan .NET derlemelerinde desteklenir ve Linux dağıtımları tarafından sağlanan derlemelerde desteklenmez.
.NET 10'dan önceki .NET sürümleri için ortam değişkeni CLR_ICU_VERSION_OVERRIDEolarak adlandırılır.
Belirtilen sürüm bulunamazsa.NET, sistemden en yüksek yüklü ICU sürümünü yüklemeye geri döner.
Bu yapılandırma, ICU sürümü kullanımını denetleme ve uygulamaya özgü veya sistem tarafından sağlanan ICU sürümleriyle uyumluluğu sağlama esnekliği sağlar.
macOS davranışı
macOS, dosyada Mach-O belirtilen yük komutlarından bağımlı dinamik kitaplıkları çözümlemek için Linux yükleyicisinden farklı bir davranışa sahiptir. Linux yükleyicisinde, ICU bağımlılık grafiğini karşılamak için .NET, libicudata, libicuuc ve libicui18n etiketlerini bu sırayla deneyebilir. Ancak macOS'ta bu işe yaramaz. macOS üzerinde ICU oluştururken, varsayılan olarak içinde bu yük komutlarını libicuuciçeren bir dinamik kitaplık alırsınız. Aşağıdaki kod parçacığı bir örnek gösterir.
~/ % 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)
Bu komutlar, ICU'nun diğer bileşenleri ile ilişkili olan bağımlı kitaplıkların adına referans verir. Yükleyici, dlopen kurallarına uyarak, aramayı sistem dizinlerinde bu kütüphanelerin bulunmasını, LD_LIBRARY_PATH çevresel değişkenlerin ayarlanmasını veya uygulama düzeyi dizinde ICU'nun bulunmasını içerecek şekilde gerçekleştirir.
LD_LIBRARY_PATH veya ICU ikili dosyalarının uygulama düzeyi dizininde bulunduğundan emin olamıyorsanız, bazı ek işler yapmanız gerekir.
Yükleyici için, yükleyiciye bu yük komutuyla ikili ile aynı dizinde bu bağımlılığı aramasını belirten gibi @loader_pathbazı yönergeler vardır. Bunu başarmanın iki yolu vardır:
install_name_tool -changeAşağıdaki komutları çalıştırın:
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.dylibYükleme adlarını oluşturmak için ICU'ya bir yama uygulayın
@loader_pathAutoconf'u (
./runConfigureICU) çalıştırmadan önce bu satırları şu şekilde değiştirin: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'de ICU
Özellikle WebAssembly iş yükleri için bir ICU sürümü kullanılabilir. Bu sürüm, masaüstü profilleriyle genelleştirme uyumluluğu sağlar. ICU veri dosyası boyutunu 24 MB'tan 1,4 MB'a (veya Brotli ile sıkıştırıldıysa yaklaşık 0,3 MB) azaltmak için bu iş yükünün birkaç sınırlaması vardır.
Aşağıdaki API'ler desteklenmez:
- CultureInfo.EnglishName
- CultureInfo.NativeName
- DateTimeFormatInfo.NativeCalendarName
- RegionInfo.NativeName
Aşağıdaki API'ler sınırlamalarla desteklenir:
- String.Normalize(NormalizationForm) ve String.IsNormalized(NormalizationForm) nadiren kullanılan FormKC ve FormKD formlarını desteklemez.
- RegionInfo.CurrencyNativeName ile aynı değeri RegionInfo.CurrencyEnglishNamedöndürür.
Ayrıca, daha az yerel desteklenir. Desteklenen liste dotnet/icu deposunda bulunabilir.
.NET uygulamalarında genelleştirme kurulumu
.NET genelleştirme başlatması, uygun genelleştirme kitaplığını yüklemeyi, kültür verilerini ayarlamayı ve genelleştirme ayarlarını yapılandırmayı içeren karmaşık bir işlemdir. Aşağıdaki bölümlerde genelleştirme başlatmanın farklı platformlarda nasıl çalıştığı açıklanmaktadır.
Windows
Windows'da .NET, genelleştirmeyi başlatmak için aşağıdaki adımları izleyin:
Genelleştirme Sabit Modu etkinleştirilip etkinleştirilmediğini denetleyin. Bu mod etkin olduğunda.NET, ICU kitaplığının yüklenmesini atlar ve NLS API'lerini kullanmaktan kaçınır. Bunun yerine yerleşik sabit kültür verilerine dayanır ve davranışın işletim sisteminden ve ICU kitaplığından tamamen bağımsız kalmasını sağlar.
NLS modu etkinleştirilip etkinleştirilmediğini denetleyin. Etkinleştirilirse, .NET ICU kitaplığını yüklemeyi atlar ve bunun yerine genelleştirme desteği için Windows NLS API'lerini kullanır.
uygulama yerel ICU özelliğinin etkinleştirilip etkinleştirilmediğini denetleyin. Varsa, .NET, belirtilen sürümü kitaplık adlarına ekleyerek uygulama dizininden ICU kitaplığını yüklemeyi dener. Örneğin, sürüm 72.1 ise, .NET önce
icuuc72.dll,icuin72.dllveicudt72.dllyüklemeye çalışır. Bu kitaplıklar yüklenemezse,icuuc72.1.dll,icuin72.1.dllveicudt72.1.dllyüklemeye çalışır. Kitaplıklardan hiçbiri bulunmazsa, işlem şu hata iletisiyle sonlandırılır:Failed to load app-local ICU: {library name}.Yukarıdaki koşullardan hiçbiri karşılanmadıysa, .NET sistem dizininden ICU kitaplığını yüklemeyi dener. İlk olarak
icu.dllyüklemeye çalışır. Bu kitaplık kullanılamıyorsa, sistem dizinindenicuuc.dllveicuin.dllyüklemeyi dener. Bu kitaplıklardan herhangi biri bulunamazsa, çalışma zamanı genelleştirme desteği için NLS API'lerini kullanmaya geri döner.
Not
NLS API'leri her zaman tüm Windows sürümlerinde kullanılabilir, bu nedenle .NET genelleştirme desteği için her zaman bunlara geri dönebilir.
Linux işletim sistemi
- Genelleştirme Sabit Modu etkinleştirilip etkinleştirilmediğini denetleyin. Bu mod etkin olduğunda. .NET, ICU kitaplığının yüklenmesini atlar. Bunun yerine yerleşik sabit kültür verilerine dayanır ve davranışın işletim sisteminden ve ICU kitaplığından tamamen bağımsız kalmasını sağlar.
-
uygulama yerel ICU özelliğinin etkinleştirilip etkinleştirilmediğini denetleyin. Varsa, .NET, belirtilen sürümü kitaplık adlarına ekleyerek uygulama dizininden ICU kitaplığını yüklemeyi dener. Örneğin, sürüm 68.2.0.9 ise, .NET
libicuuc.so.68.2.0.9velibicui18n.so.68.2.0.9yüklemeye çalışır. Kitaplıklardan hiçbiri bulunmazsa, işlem şu hata iletisiyle sonlandırılır:Failed to load app-local ICU: {library name}. -
DOTNET_ICU_VERSION_OVERRIDEortam değişkeninin ayarlı olup olmadığını denetleyin. Bu durumda .NET, Linux üzerinde belirli bir ICU sürümünü yükleme başlığında açıklandığı gibi belirtilen ICU sürümünü yüklemeyi dener. - Yukarıdaki koşullardan hiçbiri karşılanmadıysa, .NET sistemden ICU kitaplığının en yüksek yüklü sürümünü yüklemeyi dener.
libicuuc.so.[version]velibicui18n.so.[version]kitaplıklarını yüklemeye çalışır; burada[version]sistemdeki en yüksek yüklü ICU sürümüdür. Kitaplıklar bulunamazsa, işlem şu hata iletisiyle sonlandırılır:Failed to load system ICU: {library name}.
macOS
- Genelleştirme Sabit Modu etkinleştirilip etkinleştirilmediğini denetleyin. Bu mod etkin olduğunda. .NET, ICU kitaplığının yüklenmesini atlar. Bunun yerine yerleşik sabit kültür verilerine dayanır ve davranışın işletim sisteminden ve ICU kitaplığından tamamen bağımsız kalmasını sağlar.
-
uygulama yerel ICU özelliğinin etkinleştirilip etkinleştirilmediğini denetleyin. Varsa, .NET, belirtilen sürümü kitaplık adlarına ekleyerek uygulama dizininden ICU kitaplığını yüklemeyi dener. Örneğin, sürüm 68.2.0.9 ise, .NET
libicuuc68.2.0.9.dylibvelibicui18n68.2.0.9.dylibyüklemeye çalışır. Kitaplıklardan hiçbiri bulunmazsa, işlem şu hata iletisiyle sonlandırılır:Failed to load app-local ICU: {library name}. - Yukarıdaki koşullardan hiçbiri karşılanmazsa. .NET, macOS davranışı'nde açıklandığı gibi ICU kitaplığının yüklü sürümünü yüklemeye çalışır.