Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
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 ś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
- System.Span<T>
- System.String
- Większość typów w System.Globalization przestrzeni nazwowej
- 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 znaków)