Interfejsy API globalizacji używają bibliotek ICU w systemie Windows Server 2019
Program .NET 7 i nowsze wersje używają bibliotek International Components for Unicode (ICU) na potrzeby funkcji globalizacji podczas uruchamiania w systemie Windows Server 2019. Wersje nienależące do serwera systemu Windows korzystają z funkcji ICU od platformy .NET 5. Jednak platforma .NET 7 wprowadziła obsługę ładowania ICU we wcześniejszych wersjach klienta systemu Windows, w szczególności systemu Windows 10 w wersji 1703, 1709, 1803 i 1809.
Poprzednie zachowanie
W programach .NET 5 i .NET 6 biblioteki .NET używały interfejsów API obsługi języka narodowego (NLS) na potrzeby funkcji globalizacji w systemie Windows Server 2019. Na przykład funkcje NLS były używane do porównywania ciągów, pobierania informacji o kulturze i wykonywania wielkości liter ciągów w odpowiedniej kulturze. To zachowanie dotyczy również wersji klienta systemu Windows 10, takich jak 1703, 1709, 1803 i 1809.
Nowe zachowanie
Począwszy od platformy .NET 7, jeśli aplikacja jest uruchomiona w systemie Windows Server 2019 lub Windows 10 w wersji 1703, 1709, 1803 i 1809, biblioteki platformy .NET domyślnie używają interfejsów API globalizacji ICU . (Wersje systemu Windows nienależące do serwera korzystają już z funkcji ICU od platformy .NET 5, więc nie ma żadnych zmian w tych wersjach).
Różnice behawioralne
Zmiany w aplikacji mogą być widoczne, nawet jeśli nie zdajesz sobie sprawy, że używasz obiektów globalizacji. W poniższym przykładzie pokazano jedną ze zmian behawioralnych, które można zobaczyć, ale są też inne.
Symbol waluty
Rozważ następujący kod, który formatuje ciąg przy użyciu specyfikatora C
formatu waluty . Kultura bieżącego wątku jest ustawiona na kulturę obejmującą tylko język, a nie kraj lub region.
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
- W programach .NET 5 i .NET 6 w systemie Windows Server 2019 lub Windows 10 w wersjach 1703, 1709, 1803 i 1809 wartość tekstu to
"100,00 €"
. - W programie .NET 7 w systemie Windows Server 2019 lub Windows 10 w wersji 1703, 1709, 1803 i 1809 wartość tekstu to
"100,00 ¤"
, która używa symbolu waluty międzynarodowej zamiast euro. W ICU projekt polega na tym, że waluta jest właściwością kraju lub regionu, a nie języka.
Przyczyna wprowadzenia zmiany
- Platforma .NET wprowadziła niektóre interfejsy API, które zależą od bibliotek ICU, na przykład TimeZoneInfo.TryConvertIanaIdToWindowsId(String, String). Użytkownicy, którzy chcieli używać takich interfejsów API w systemie Windows Server 2019, musieli ręcznie wdrożyć biblioteki ICU przy użyciu ich plików binarnych przy użyciu funkcji lokalnej aplikacji ICU. Nie było to doskonałe rozwiązanie, ponieważ kod może znajdować się w bibliotece, która nie może kontrolować wymuszania instalowania bibliotek ICU przy użyciu dowolnej aplikacji lub usługi przy użyciu biblioteki.
- Jeśli system Windows Server 2019 jest automatycznie dostarczany przez platformę w chmurze (na przykład platformę Azure), wdrożona usługa nie musi wiedzieć, że będzie działać na takim serwerze. Ponadto właściciel usługi musi zarządzać if/when, aby wdrożyć pliki binarne ICU. Ponadto każda usługa wdrożona w chmurze przy użyciu systemu Windows Server 2019, która chce korzystać z nowych interfejsów API zależnych od ICU platformy .NET, musi wdrożyć pliki binarne ICU w usłudze. Może to wdęć rozmiar dysku na serwerze.
- Niektórzy użytkownicy wolą domyślnie używać ICU, ponieważ jest on zgodny z standardem Unicode.
Wprowadzona wersja
.NET 7
Zalecana akcja
Jeśli używasz platformy .NET 7 w systemie Windows Server 2019 lub Windows 10 w wersji 1703, 1709, 1803 lub 1809, zalecamy przetestowanie aplikacji lub usługi przed jej wysyłką, aby upewnić się, że zachowanie jest zgodnie z oczekiwaniami i nie przerywa żadnych użytkowników.
Jeśli chcesz nadal korzystać z interfejsów API globalizacji nlS, możesz ustawić przełącznik czasu wykonywania, aby przywrócić to zachowanie. Aby uzyskać więcej informacji na temat dostępnych przełączników, zobacz artykuł Globalizacja platformy .NET i ICU .
Dotyczy interfejsów API
- System.Span<T>
- System.String
- Większość typów w System.Globalization przestrzeni nazw
- System.Array.Sort (podczas sortowania tablicy ciągów)
- System.Collections.Generic.List<T>.Sort() (gdy elementy listy są ciągami)
- System.Collections.Generic.SortedDictionary<TKey,TValue> (gdy klucze są ciągami)
- System.Collections.Generic.SortedList<TKey,TValue> (gdy klucze są ciągami)
- System.Collections.Generic.SortedSet<T> (gdy zestaw zawiera ciągi)