Dela via


Globaliserings-API:er använder ICU-bibliotek på Windows Server 2019

.NET 7- och senare versioner använder ICU-bibliotek (International Components for Unicode) för globaliseringsfunktioner när de körs på Windows Server 2019. Icke-serverversioner av Windows har använt ICU sedan .NET 5. .NET 7 introducerade dock stöd för inläsning av ICU i tidigare Windows-klientversioner, särskilt Windows 10-versionerna 1703, 1709, 1803 och 1809.

Tidigare beteende

I .NET 5 och .NET 6 använde .NET-biblioteken NLS-API:er (National Language Support) för globaliseringsfunktioner i Windows Server 2019. NLS-funktioner användes till exempel för att jämföra strängar, hämta kulturinformation och utföra stränghölje i lämplig kultur. Det här beteendet gäller även för Windows 10-klientversioner, till exempel 1703, 1709, 1803 och 1809.

Nytt beteende

Från och med .NET 7, om en app körs på Windows Server 2019 eller Windows 10-klientversionerna 1703, 1709, 1803 och 1809, använder .NET-bibliotek som standard ICU-globaliserings-API :er. (Windows-versioner som inte är server har redan använt ICU sedan .NET 5, så det finns ingen ändring för dessa versioner.)

Beteendeskillnader

Du kan se ändringar i din app även om du inte inser att du använder globaliseringsanläggningar. I följande exempel visas en av de beteendeändringar som du kan se, men det finns även andra.

Valutasymbol

Överväg följande kod som formaterar en sträng med hjälp av valutaformatsspecificeraren C. Den aktuella trådens kultur är inställd på en kultur som endast innehåller språket och inte landet eller regionen.

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
  • I .NET 5 och .NET 6 på Windows Server 2019 eller Windows 10-klientversionerna 1703, 1709, 1803 och 1809 är "100,00 €"värdet för text .
  • I .NET 7 på Windows Server 2019 eller Windows 10-klientversionerna 1703, 1709, 1803 och 1809 är "100,00 ¤"värdet för text , som använder den internationella valutasymbolen i stället för euron. I ICU är designen att en valuta är en egenskap för ett land eller en region, inte ett språk.

Orsak till ändringen

  • .NET introducerade vissa API:er som är beroende av ICU-bibliotek, till exempel TimeZoneInfo.TryConvertIanaIdToWindowsId(String, String). Användare som ville använda sådana API:er på Windows Server 2019 var skyldiga att manuellt distribuera ICU-bibliotek med sina binärfiler med hjälp av funktionen Lokal ICU-app. Det här var ingen bra lösning eftersom koden kan finnas i ett bibliotek som inte kan styra att tvinga ICU-bibliotek att installeras med vilken app eller tjänst som helst som använder biblioteket.
  • Om Windows Server 2019 tillhandahålls automatiskt av en molnplattform (till exempel Azure) vet den distribuerade tjänsten inte nödvändigtvis att den kommer att köras på en sådan server. Dessutom måste tjänstägaren hantera om/när ICU-binärfiler ska distribueras. Dessutom måste alla tjänster som distribueras till molnet med Windows Server 2019 som vill använda de nya .NET ICU-beroende API:erna distribuera ICU-binärfilerna med tjänsten. Detta kan göra att storleken på disken på servern är uppsvälld.
  • Vissa användare föredrar att använda ICU som standard eftersom det överensstämmer mer med Unicode Standard.

Version introducerad

.NET 7

Om du använder .NET 7 på Windows Server 2019 eller Windows 10-klientversionerna 1703, 1709, 1803 eller 1809 rekommenderar vi att du testar appen eller tjänsten innan du skickar den för att säkerställa att beteendet är som förväntat och inte bryter några användare.

Om du vill fortsätta använda NLS-globaliserings-API:er kan du ställa in en körningsväxel för att återgå till det beteendet. Mer information om tillgängliga växlar finns i artikeln om .NET-globalisering och ICU .

Berörda API:er

Se även