Udostępnij przez


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) dla funkcji globalizacji podczas uruchamiania na Windows Server 2019. Wersje nie-serwerowe systemu Windows korzystają z ICU od .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 wersjach .NET 5 i .NET 6 biblioteki .NET używały API National Language Support (NLS) do 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 zmiany 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

Od wersji .NET 7, jeśli aplikacja jest uruchomiona w systemie Windows Server 2019 lub Windows 10 we wersjach 1703, 1709, 1803 i 1809, biblioteki .NET domyślnie używają funkcji 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 funkcji 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 Cformatu waluty . Ustawienia kulturowe bieżącego wątku są skonfigurowane tak, by zawierały 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 klienckich 1703, 1709, 1803 i 1809, wartość tekstu to "100,00 €".
  • W programie .NET 7 w systemie Windows Server 2019 lub Windows 10 w wersjach 1703, 1709, 1803 i 1809 wartość tekstowa wynosi "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 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ć wymuszenia instalacji bibliotek ICU przez dowolną aplikację lub usługę korzystającą z tej 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ć tym, czy i kiedy wdrażać 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 rozdmuchać rozmiar na dysku na serwerze.
  • Niektórzy użytkownicy wolą domyślnie używać ICU, ponieważ jest on zgodny z standardem Unicode.

Wersja wprowadzona

.NET 7

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 środowiska uruchomieniowego , aby przywrócić to zachowanie. Aby uzyskać więcej informacji na temat dostępnych przełączników, zobacz artykuł Globalizacja platformy .NET i ICU .

Interfejsy API, których dotyczy problem

Zobacz także