Globalisierungs-APIs verwenden ICU-Bibliotheken unter Windows Server 2019
.NET 7 und höhere Versionen verwenden bei der Ausführung unter Windows Server 2019 International Components for Unicode, internationale Komponenten für Unicode, ICU Bibliotheken für die Globalisierungsfunktionalität. Nicht-Servereditionen von Windows verwenden ICU seit .NET 5 . .NET 7 hat jedoch Unterstützung für das Laden von ICU in früheren Windows-Clientversionen eingeführt, insbesondere für Windows 10-Versionen 1703, 1709, 1803 und 1809.
Vorheriges Verhalten
In .NET 5 und .NET 6 verwendeten die .NET-Bibliotheken NLS-APIs (National Language Support) für Globalisierungsfunktionalität unter Windows Server 2019. Beispielsweise wurden NLS-Funktionen verwendet, um Zeichenfolgen zu vergleichen, Informationen zur Kultur abzurufen und Groß-/Kleinschreibung von Zeichenfolgen gemäß der entsprechenden Kultur umzusetzen. Dieses Verhalten gilt auch für Windows 10-Clientversionen, z. B. 1703, 1709, 1803 und 1809.
Neues Verhalten
Ab .NET 7 verwenden .NET-Bibliotheken, wenn eine App auf Windows Server 2019 oder Windows 10 Clientversionen 1703, 1709, 1803, und 1809 ausgeführt wird, standardmäßig Globalisierungs-APIs von ICU. (Nicht-Server-Windows-Versionen verwenden ICU bereits seit .NET 5, daher gibt es keine Änderungen für diese Versionen.)
Verhaltensunterschiede
Möglicherweise bemerken Sie Änderungen in Ihrer Anwendung, auch wenn Sie sich nicht bewusst sind, dass Sie Globalisierungsfunktionen nutzen. Das folgende Beispiel zeigt einen der Behavior Changes, die Sie möglicherweise beobachten, aber es gibt noch weitere.
Währungssymbol
Betrachten Sie den folgenden Code, der eine Zeichenfolge mit C
als Spezifizierer des Währungsformats formatiert. Die Kultur des aktuellen Threads ist auf eine Kultur festgelegt, die nur die Sprache und nicht das Land oder die Region umfasst.
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
- In .NET 5 und .NET 6 unter Windows Server 2019 oder Windows 10 Clientversionen 1703, 1709, 1803, und 1809, ist der Wert des Texts
"100,00 €"
. - Ab .NET 7 unter Windows Server 2019 oder Windows 10 Clientversionen 1703, 1709, 1803, und 1809 ist der Wert des Texts
"100,00 ¤"
, in dem das internationale Währungssymbol anstelle von Euro verwendet wird. In ICU ist eine Währung eine Eigenschaft eines Landes oder einer Region und nicht einer Sprache.
Grund für die Änderung
- .NET hat einige APIs eingeführt, die von ICU-Bibliotheken abhängen, z. B. TimeZoneInfo.TryConvertIanaIdToWindowsId(String, String). Benutzer, die solche APIs unter Windows Server 2019 verwenden wollten, mussten ICU-Bibliotheken mit ihren Binärdateien manuell mithilfe der lokalen ICU-App bereitstellen. Dies war keine gute Lösung, da sich der Code in einer Bibliothek befinden kann, die nicht steuern kann, dass erzwungen wird, dass ICU-Bibliotheken mit einer beliebigen App oder einem Dienst installiert werden, die/der die Bibliothek verwendet.
- Wenn Windows Server 2019 automatisch von einer Cloudplattform (wie Azure) bereitgestellt wird, weiß der bereitgestellte Dienst nicht unbedingt, dass er auf einem solchen Server ausgeführt wird. Außerdem muss der Dienstbesitzer verwalten, ob/wann ICU-Binärdateien bereitgestellt werden sollen. Darüber hinaus muss jeder Dienst, der mit Windows Server 2019 in der Cloud bereitgestellt wird und die neuen .NET ICU-abhängigen APIs verwenden möchte, die ICU-Binärdateien mit dem Dienst bereitstellen. Dies kann die Größe auf dem Datenträger des Servers aufblähen.
- Einige Benutzer bevorzugen die standardmäßige Verwendung von ICU, da sie eher dem Unicode-Standard entspricht.
Eingeführt in Version
.NET 7
Empfohlene Maßnahme
Wenn Sie .NET 7 unter Windows Server 2019 oder Windows 10 Clientversionen 1703, 1709, 1803, und 1809 verwenden, sollten Sie Ihre App oder Ihren Dienst vor dem Versand testen, um sicherzustellen, dass das Verhalten den Erwartungen entspricht und keine Benutzer beeinträchtigt werden.
Wenn Sie weiterhin NLS-Globalisierungs-APIs verwenden möchten, können Sie einen Runtimeschalter festlegen, um zu diesem Verhalten zurückzukehren. Weitere Informationen zu den verfügbaren Schaltern finden Sie im Artikel .NET-Globalisierung und ICU.
Betroffene APIs
- System.Span<T>
- System.String
- Die meisten Typen im System.Globalization-Namespace
- System.Array.Sort (beim Sortieren eines Zeichenfolgenarrays)
- System.Collections.Generic.List<T>.Sort() (wenn die Listenelemente Zeichenfolgen sind)
- System.Collections.Generic.SortedDictionary<TKey,TValue> (wenn die Schlüssel Zeichenfolgen sind)
- System.Collections.Generic.SortedList<TKey,TValue> (wenn die Schlüssel Zeichenfolgen sind)
- System.Collections.Generic.SortedSet<T> (wenn die Gruppe Zeichenfolgen enthält)