Ponowne pobieranie zmian migracji do programu .NET Framework 4.6.x
W tym artykule wymieniono problemy ze zgodnością aplikacji wprowadzone w programie .NET Framework 4.6, 4.6.1 i 4.6.2.
.NET framework 4.6
ASP.NET
Funkcja HtmlTextWriter nie renderuje <br/>
elementu poprawnie
Szczegóły
Począwszy od programu .NET Framework 4.6, wywołanie RenderBeginTag(String) metody i RenderEndTag() elementem <BR />
poprawnie wstawi tylko jeden <BR />
(zamiast dwóch)
Sugestia
Jeśli aplikacja zależy od dodatkowego <BR />
tagu, RenderBeginTag(String) powinna zostać wywołana po raz drugi. Należy pamiętać, że ta zmiana zachowania dotyczy tylko aplikacji przeznaczonych dla programu .NET Framework 4.6 lub nowszego, więc inną opcją jest skierowanie poprzedniej wersji programu .NET Framework w celu uzyskania starego zachowania.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6 |
Typ | Przekierowanie |
Dotyczy interfejsów API
ClickOnce
Aplikacje opublikowane za pomocą technologii ClickOnce korzystające z certyfikatu podpisywania kodu SHA-256 mogą zakończyć się niepowodzeniem w systemie Windows 2003
Szczegóły
Plik wykonywalny jest podpisany przy użyciu algorytmu SHA256. Wcześniej został podpisany przy użyciu algorytmu SHA1 niezależnie od tego, czy certyfikat podpisywania kodu to SHA-1, czy SHA-256. Dotyczy to:
- Wszystkie aplikacje utworzone przy użyciu programu Visual Studio 2012 lub nowszego.
- Aplikacje utworzone przy użyciu programu Visual Studio 2010 lub starszego w systemach z obecnym programem .NET Framework 4.5. Ponadto, jeśli jest obecny program .NET Framework 4.5 lub nowszy, manifest ClickOnce jest również podpisany przy użyciu algorytmu SHA-256 dla certyfikatów SHA-256 niezależnie od wersji programu .NET Framework, względem której został skompilowany.
Sugestia
Zmiana podpisywania pliku wykonywalnego ClickOnce ma wpływ tylko na systemy Windows Server 2003; wymagają zainstalowania 938397 KB. Zmiana podpisywania manifestu przy użyciu algorytmu SHA-256 nawet wtedy, gdy aplikacja jest przeznaczona dla programu .NET Framework 4.0 lub starszej wersji, wprowadza zależność środowiska uruchomieniowego od programu .NET Framework 4.5 lub nowszej wersji.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.5 |
Typ | Przekierowanie |
Aplikacja ClickOnce obsługuje algorytm SHA-256 w aplikacjach docelowych 4.0
Szczegóły
Wcześniej aplikacja ClickOnce z certyfikatem podpisanym przy użyciu algorytmu SHA-256 wymagałaby obecności programu .NET Framework 4.5 lub nowszego, nawet jeśli aplikacja jest przeznaczona dla wersji 4.0. Teraz aplikacje ClickOnce przeznaczone dla programu .NET Framework 4.0 mogą działać na platformie .NET Framework 4.0, nawet jeśli są podpisane przy użyciu algorytmu SHA-256.
Sugestia
Ta zmiana usuwa tę zależność i umożliwia używanie certyfikatów SHA-256 do podpisywania aplikacji ClickOnce przeznaczonych dla platformy .NET Framework 4 i starszych wersji.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6 |
Typ | Przekierowanie |
Podstawowe funkcje
Przepływ CurrentCulture i CurrentUICulture między zadaniami
Szczegóły
Począwszy od programu .NET Framework 4.6 i System.Globalization.CultureInfo.CurrentCulture System.Globalization.CultureInfo.CurrentUICulture są przechowywane w wątku System.Threading.ExecutionContext, który przepływa w operacjach asynchronicznych. Oznacza to, że zmiany lub System.Globalization.CultureInfo.CurrentCulture System.Globalization.CultureInfo.CurrentUICulture zostaną odzwierciedlone w zadaniach, które są później uruchamiane asynchronicznie. Różni się to od zachowania poprzednich wersji programu .NET Framework (co spowoduje zresetowanie System.Globalization.CultureInfo.CurrentCulture i System.Globalization.CultureInfo.CurrentUICulture we wszystkich zadaniach asynchronicznych).
Sugestia
Aplikacje, których dotyczy ta zmiana, mogą obejść ją przez jawne ustawienie żądanej operacji lub System.Globalization.CultureInfo.CurrentUICulture jako pierwszej operacji w asynchronicznych System.Globalization.CultureInfo.CurrentCulture zadaniach. Alternatywnie stare zachowanie (nie przepływające System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) może zostać wybrane przez ustawienie następującego przełącznika zgodności:
AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);
Ten problem został rozwiązany przez WPF w programie .NET Framework 4.6.2. Naprawiono ją również w programach .NET Framework 4.6, 4.6.1 do KB 3139549. Aplikacje przeznaczone dla platformy .NET Framework 4.6 lub nowszej automatycznie uzyskają odpowiednie zachowanie w aplikacjach WPF — System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) zostaną zachowane w operacjach dyspozytora.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6 |
Typ | Przekierowanie |
Dotyczy interfejsów API
- CultureInfo.CurrentCulture
- Thread.CurrentCulture
- CultureInfo.CurrentUICulture
- Thread.CurrentUICulture
Nazwy zdarzeń ETW nie mogą się różnić tylko od sufiksu "Start" lub "Stop"
Szczegóły
W programach .NET Framework 4.6 i 4.6.1 środowisko uruchomieniowe zgłasza ArgumentException błąd, gdy dwie nazwy zdarzeń śledzenia zdarzeń systemu Windows (ETW) różnią się tylko sufiksem "Uruchom" lub "Zatrzymaj" (tak jak w przypadku, gdy jedno zdarzenie ma nazwę LogUser
, a inne ma nazwę LogUserStart
). W takim przypadku środowisko uruchomieniowe nie może skonstruować źródła zdarzeń, które nie może emitować żadnego rejestrowania.
Sugestia
Aby zapobiec wyjątkowi, upewnij się, że żadne dwie nazwy zdarzeń nie różnią się tylko sufiksem "Start" lub "Stop". To wymaganie jest usuwane, począwszy od programu .NET Framework 4.6.2; środowisko uruchomieniowe może uściślać nazwy zdarzeń, które różnią się tylko sufiksem "Start" i "Stop".
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6 |
Typ | Przekierowanie |
Entity Framework
Tworzenie pliku edmx Entity Framework w programie Visual Studio 2013 może zakończyć się niepowodzeniem z powodu błędu MSB4062 w przypadku korzystania z zadań EntityDeploySplit lub EntityClean
Szczegóły
W narzędziach MSBuild 12.0 (dołączonych do programu Visual Studio 2013) zostały zmienione lokalizacje plików programu MSBuild, co powoduje, że starsze pliki obiektów docelowych programu Entity Framework są nieprawidłowe. W wyniku tego zadania EntityDeploySplit
i EntityClean
kończą się niepowodzeniem, ponieważ nie można odnaleźć biblioteki Microsoft.Data.Entity.Build.Tasks.dll
. Należy pamiętać, że ten problem wynika ze zmiany dotyczącej zestawu narzędzi (MSBuild/VS), a nie ze zmiany w programie .NET Framework. Wystąpi on tylko w przypadku uaktualniania narzędzi dla deweloperów, a nie w przypadku uaktualniania samego programu .NET Framework.
Sugestia
Pliki obiektów docelowych Entity Framework są naprawione do pracy z nowym układem MSBuild począwszy od wersji .NET Framework 4.6. Uaktualnienie do tej wersji platformy Framework rozwiąże ten problem. Alternatywnie można zastosować to obejście do poprawiania bezpośrednio plików obiektów docelowych.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Główna |
Wersja | 4.5.1 |
Typ | Przekierowanie |
JIT
Ponowna próba il nie jest dozwolona w regionie try
Szczegóły
W przeciwieństwie do kompilatora JIT64 just in time, RyuJIT (używany w programie .NET Framework 4.6) nie zezwala na instrukcję ponawiania prób w regionie try. Powrót z regionu try jest niedozwolony przez specyfikację ECMA-335 i żaden znany zarządzany kompilator nie generuje takiego il. Jednak kompilator JIT64 wykona taki il, jeśli zostanie wygenerowany przy użyciu emitu odbicia.
Sugestia
Jeśli aplikacja generuje il, który zawiera kod operacji ponownej próby w regionie try, aplikacja może kierować program .NET Framework 4.5 do korzystania ze starego trybu JIT i uniknąć tego przerwania. Alternatywnie wygenerowany il może zostać zaktualizowany, aby powrócić po regionie try.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6 |
Typ | Przekierowanie |
Nowy 64-bitowy kompilator JIT w programie .NET Framework 4.6
Szczegóły
Począwszy od programu .NET Framework 4.6, nowy 64-bitowy kompilator JIT jest używany do kompilacji typu just in time. W niektórych przypadkach zgłaszany jest nieoczekiwany wyjątek lub zaobserwowano inne zachowanie niż w przypadku uruchomienia aplikacji przy użyciu kompilatora 32-bitowego lub starszego kompilatora JIT w wersji 64-bitowej. Ta zmiana nie ma wpływu na 32-bitowy kompilator JIT. Znane różnice obejmują następujące elementy:
- W pewnych warunkach operacja rozpatrunia może zgłaszać NullReferenceException kompilacje wydania z włączoną optymalizacją.
- W niektórych przypadkach wykonanie kodu produkcyjnego w dużej treści metody może zgłosić błąd StackOverflowException.
- W pewnych warunkach struktury przekazywane do metody są traktowane jako typy referencyjne, a nie jako typy wartości w kompilacjach wydania. Jednym z objawów tego problemu jest to, że poszczególne elementy w kolekcji pojawiają się w nieoczekiwanej kolejności.
- W pewnych warunkach porównanie wartości z ich zestawem bitów UInt16 jest niepoprawne, jeśli włączono optymalizację.
- W pewnych warunkach, szczególnie podczas inicjowania wartości tablicy, inicjowanie pamięci przez OpCodes.Initblk instrukcję IL może zainicjować pamięć z nieprawidłową wartością. Może to spowodować nieobsługiwany wyjątek lub nieprawidłowe dane wyjściowe.
- W pewnych rzadkich warunkach test bitowy warunkowy może zwrócić nieprawidłową Boolean wartość lub zgłosić wyjątek, jeśli włączono optymalizacje kompilatora.
- W pewnych warunkach, jeśli instrukcja
if
jest używana do testowania warunku przed wprowadzeniemtry
bloku i wyjścia ztry
bloku, a ten sam warunek jest obliczany wcatch
bloku lubfinally
, nowy kompilator 64-bitowy JIT usuwaif
warunek zcatch
bloku lubfinally
podczas optymalizowania kodu. W rezultacie kod wewnątrz instrukcjiif
wcatch
bloku orfinally
jest wykonywany bezwarunkowo.
Sugestia
Środki zaradcze znanych problemów
Jeśli napotkasz wymienione powyżej problemy, możesz rozwiązać je, wykonując dowolną z następujących czynności:
Uaktualnij program .NET Framework do wersji 4.6.2. Nowy kompilator 64-bitowy dołączony do programu .NET Framework 4.6.2 rozwiązuje każde z tych znanych problemów.
Upewnij się, że twoja wersja systemu Windows jest aktualna, uruchamiając usługę Windows Update. Aktualizacje usług programu .NET Framework 4.6 i 4.6.1 dotyczą każdego z tych problemów, z wyjątkiem NullReferenceException operacji rozpakowania.
Kompiluj przy użyciu starszego 64-bitowego kompilatora JIT. Aby uzyskać więcej informacji na temat tego, jak to zrobić, zobacz sekcję Środki zaradcze innych problemów . Środki zaradcze innych problemów
Jeśli wystąpi inna różnica w zachowaniu między kodem skompilowanym ze starszym kompilatorem 64-bitowym i nowym kompilatorem JIT 64-bitowym lub między wersjami debugowania i wydania aplikacji skompilowanymi przy użyciu nowego kompilatora JIT w wersji 64-bitowej, możesz wykonać następujące czynności, aby skompilować aplikację przy użyciu starszego kompilatora JIT w wersji 64-bitowej:Dla poszczególnych aplikacji można dodać < element do pliku konfiguracji aplikacji. Poniższe polecenie wyłącza kompilację przy użyciu nowego 64-bitowego kompilatora JIT, a zamiast tego używa starszego kompilatora JIT w wersji 64-bitowej.
<?xml version ="1.0"?> <configuration> <runtime> <useLegacyJit enabled="1" /> </runtime> </configuration>
Dla poszczególnych użytkowników można dodać
REG_DWORD
wartość o nazwieuseLegacyJit
doHKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework
klucza rejestru. Wartość 1 umożliwia starsze 64-bitowe kompilator JIT; wartość 0 wyłącza ją i włącza nowy 64-bitowy kompilator JIT.Dla poszczególnych maszyn można dodać
REG_DWORD
wartość o nazwieuseLegacyJit
doHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework
klucza rejestru. Wartość1
umożliwia korzystanie ze starszego kompilatora 64-bitowego JIT; wartość0
wyłącza ją i włącza nowy 64-bitowy kompilator JIT. Możesz również poinformować nas o problemie, zgłaszając usterkę w programie Microsoft Connect.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6 |
Typ | Przekierowanie |
Sieć
Walidacja OID certyfikatu EKU
Szczegóły
Począwszy od programu .NET Framework 4.6, SslStream klasy or ServicePointManager przeprowadzają walidację identyfikatora obiektu rozszerzonego użycia klucza (EKU). Rozszerzenie rozszerzonego użycia klucza (EKU) to kolekcja identyfikatorów obiektów (OID), które wskazują aplikacje używające klucza. Walidacja identyfikatora EKU używa zdalnych wywołań zwrotnych certyfikatów, aby upewnić się, że certyfikat zdalny ma poprawne identyfikatory OID przeznaczone do zamierzonego celu.
Sugestia
Jeśli ta zmiana jest niepożądana, możesz wyłączyć walidację identyfikatora EKU certyfikatu, dodając następujący przełącznik do <przełącznika AppContextSwitchOverrides> w ` pliku konfiguracji aplikacji:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontCheckCertificateEKUs=true" />
</runtime>
Ważne
To ustawienie jest dostępne tylko dla zgodności z poprzednimi wersjami. Jego użycie nie jest zalecane.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6 |
Typ | Przekierowanie |
Dotyczy interfejsów API
- System.Net.Security.SslStream
- System.Net.ServicePointManager
- System.Net.Http.HttpClient
- System.Net.Mail.SmtpClient
- System.Net.HttpWebRequest
- System.Net.FtpWebRequest
Tylko protokoły Tls 1.0, 1.1 i 1.2 obsługiwane w system.Net.ServicePointManager i System.Net.Security.SslStream
Szczegóły
Począwszy od programu .NET Framework 4.6, ServicePointManager klasy i SslStream mogą używać tylko jednego z następujących trzech protokołów: Tls1.0, Tls1.1 lub Tls1.2. Protokół SSL3.0 i szyfr RC4 nie są obsługiwane.
Sugestia
Zalecane ograniczenie ryzyka polega na uaktualnieniu aplikacji po stronie serwera do protokołu Tls1.0, Tls1.1 lub Tls1.2. Jeśli nie jest to możliwe lub jeśli aplikacje klienckie są uszkodzone, System.AppContext klasa może służyć do rezygnacji z tej funkcji na jeden z dwóch sposobów:
- Programowe ustawianie przełączników compat na obiekcie , zgodnie z System.AppContextopisem w tym miejscu.
- Dodając następujący wiersz do
<runtime>
sekcji pliku app.config:
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=true"/>
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6 |
Typ | Przekierowanie |
Dotyczy interfejsów API
Protokół TLS 1.x domyślnie przekazuje flagę SCH_SEND_AUX_RECORD do bazowego interfejsu API SCHANNEL
Szczegóły
W przypadku korzystania z protokołu TLS 1.x platforma .NET Framework korzysta z bazowego interfejsu API SCHANNEL systemu Windows. Począwszy od programu .NET Framework 4.6, flaga SCH_SEND_AUX_RECORD jest domyślnie przekazywana do SCHANNEL. Powoduje to podzielenie danych SCHANNEL na dwa oddzielne rekordy, pierwszy jako jeden bajt i drugi jako n-1 bajty. W rzadkich przypadkach przerywa to komunikację między klientami a istniejącymi serwerami, które zakładają, że dane znajdują się w jednym rekordzie.
Sugestia
Jeśli ta zmiana przerywa komunikację z istniejącym serwerem, możesz wyłączyć wysyłanie flagi SCH_SEND_AUX_RECORD i przywrócić poprzednie zachowanie nieudzielenia danych na oddzielne rekordy, dodając następujący przełącznik do <AppContextSwitchOverrides>
elementu w <runtime>
sekcji pliku konfiguracji aplikacji:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchSendAuxRecord=true" />
</runtime>
Ważne
To ustawienie jest dostępne tylko dla zgodności z poprzednimi wersjami. Jego użycie nie jest zalecane.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6 |
Typ | Przekierowanie |
Dotyczy interfejsów API
- System.Net.Security.SslStream
- System.Net.ServicePointManager
- System.Net.Http.HttpClient
- System.Net.Mail.SmtpClient
- System.Net.HttpWebRequest
- System.Net.FtpWebRequest
Windows Communication Foundation (WCF)
Wywoływanie metody CreateDefaultAuthorizationContext z argumentem null zostało zmienione
Szczegóły
Implementacja zwrócona System.IdentityModel.Policy.AuthorizationContext przez wywołanie System.IdentityModel.Policy.AuthorizationContext.CreateDefaultAuthorizationContext(IList<IAuthorizationPolicy>) elementu z argumentem authorizationPolicies o wartości null zmieniła swoją implementację w programie .NET Framework 4.6.
Sugestia
W rzadkich przypadkach aplikacje WCF korzystające z uwierzytelniania niestandardowego mogą widzieć różnice behawioralne. W takich przypadkach poprzednie zachowanie można przywrócić na jeden z dwóch sposobów:
Ponownie skompiluj aplikację, aby kierować do wcześniejszej wersji programu .NET Framework niż 4.6. W przypadku usług hostowanych przez usługi IIS użyj
<httpRuntime targetFramework="x.x">
elementu , aby kierować do wcześniejszej wersji programu .NET Framework.Dodaj następujący wiersz do
<appSettings>
sekcji pliku app.config:<add key="appContext.SetSwitch:Switch.System.IdentityModel.EnableCachedEmptyDefaultAuthorizationContext" value="true" />
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6 |
Typ | Przekierowanie |
Dotyczy interfejsów API
Windows Forms
Icon.ToBitmap pomyślnie konwertuje ikony z ramkami PNG na obiekty mapy bitowej
Szczegóły
Począwszy od aplikacji przeznaczonych dla programu .NET Framework 4.6, Icon.ToBitmap metoda pomyślnie konwertuje ikony z ramkami PNG na obiekty mapy bitowej.
W aplikacjach przeznaczonych dla programu .NET Framework 4.5.2 i starszych wersji metoda zgłasza ArgumentOutOfRangeException wyjątek, Icon.ToBitmap jeśli obiekt Icon ma ramki PNG.
Ta zmiana dotyczy aplikacji, które są ponownie skompilowane w celu kierowania programu .NET Framework 4.6 i implementują specjalną obsługę zgłaszaną ArgumentOutOfRangeException , gdy obiekt Ikona ma ramki PNG. W przypadku uruchamiania w programie .NET Framework 4.6 konwersja zakończy się pomyślnie, ArgumentOutOfRangeException nie zostanie już zgłoszona, a zatem program obsługi wyjątków nie jest już wywoływany.
Sugestia
Jeśli to zachowanie jest niepożądane, możesz zachować poprzednie zachowanie, dodając następujący element do <runtime>
sekcji pliku app.config:
<AppContextSwitchOverrides
value="Switch.System.Drawing.DontSupportPngFramesInIcons=true" />
Jeśli plik app.config zawiera AppContextSwitchOverrides
już element, nowa wartość powinna zostać scalona z atrybutem value w następujący sposób:
<AppContextSwitchOverrides
value="Switch.System.Drawing.DontSupportPngFramesInIcons=true;<previous key>=<previous value>" />
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6 |
Typ | Przekierowanie |
Dotyczy interfejsów API
Windows Presentation Foundation (WPF)
CurrentCulture nie jest zachowywana w operacjach dyspozytora WPF
Szczegóły
Począwszy od programu .NET Framework 4.6, zmiany lub System.Globalization.CultureInfo.CurrentCulture System.Globalization.CultureInfo.CurrentUICulture wprowadzone w ramach elementu System.Windows.Threading.Dispatcher zostaną utracone na końcu tej operacji dyspozytora. Podobnie zmiany operacji System.Globalization.CultureInfo.CurrentCulture dyspozytora lub System.Globalization.CultureInfo.CurrentUICulture wprowadzone poza operacją dyspozytora mogą nie zostać odzwierciedlone podczas wykonywania tej operacji. Praktycznie oznacza to, że System.Globalization.CultureInfo.CurrentCulture i System.Globalization.CultureInfo.CurrentUICulture zmiany mogą nie przepływać między wywołaniami zwrotnymi interfejsu użytkownika WPF a innym kodem w aplikacji WPF. Jest to spowodowane zmianą, System.Threading.ExecutionContext która powoduje System.Globalization.CultureInfo.CurrentCulture i System.Globalization.CultureInfo.CurrentUICulture jest przechowywana w kontekście wykonywania, począwszy od aplikacji przeznaczonych dla programu .NET Framework 4.6. Operacje dyspozytora WPF przechowują kontekst wykonywania używany do rozpoczęcia operacji i przywracania poprzedniego kontekstu po zakończeniu operacji. Ponieważ System.Globalization.CultureInfo.CurrentCulture i System.Globalization.CultureInfo.CurrentUICulture są teraz częścią tego kontekstu, zmiany w nich w ramach operacji dyspozytora nie są utrwalane poza operacją.
Sugestia
Aplikacje, których dotyczy ta zmiana, mogą obejść ten problem, przechowując żądane System.Globalization.CultureInfo.CurrentCulture lub System.Globalization.CultureInfo.CurrentUICulture w polu i sprawdzając wszystkie jednostki operacji dyspozytora (w tym programy obsługi wywołania zwrotnego zdarzeń interfejsu użytkownika), które są poprawne System.Globalization.CultureInfo.CurrentCulture i System.Globalization.CultureInfo.CurrentUICulture ustawione. Alternatywnie, ponieważ zmiana ExecutionContext bazowa tej zmiany WPF dotyczy tylko aplikacji przeznaczonych dla platformy .NET Framework 4.6 lub nowszej, tej przerwy można uniknąć przez ustawienie przełącznika zgodności programu .NET Framework 4.5.2.Apps, które są przeznaczone dla platformy .NET Framework 4.6 lub nowszej, można również obejść ten problem, ustawiając następujący przełącznik zgodności:
AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);
Ten problem został rozwiązany przez WPF w programie .NET Framework 4.6.2. Naprawiono ją również w programach .NET Framework 4.6, 4.6.1 do KB 3139549. Aplikacje przeznaczone dla platformy .NET Framework 4.6 lub nowszej automatycznie uzyskają odpowiednie zachowanie w aplikacjach WPF — System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) zostaną zachowane w operacjach dyspozytora.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6 |
Typ | Przekierowanie |
Zaokrąglanie marginesów w układzie WPF zostało zmienione
Szczegóły
Sposób, w jaki marginesy są zaokrąglone i obramowania, a tło wewnątrz nich uległo zmianie. W wyniku tej zmiany:
- Szerokość lub wysokość elementów mogą rosnąć lub zmniejszać o najwyżej jeden piksel.
- Umieszczanie obiektu może być przenoszone przez co najwyżej jeden piksel.
- Wyśrodkowane elementy mogą być wyśrodkowane w pionie lub w poziomie przez co najwyżej jeden piksel. Domyślnie ten nowy układ jest włączony tylko dla aplikacji przeznaczonych dla programu .NET Framework 4.6.
Sugestia
Ponieważ ta modyfikacja ma tendencję do wyeliminowania wycinków z prawej lub dolnej części kontrolek WPF w dużych wystąpieniach DPI, aplikacje przeznaczone dla wcześniejszych wersji programu .NET Framework, ale działają na platformie .NET Framework 4.6, mogą zdecydować się na to nowe zachowanie, dodając następujący wiersz do <runtime>
sekcji pliku app.config:
<AppContextSwitchOverrides value="Switch.MS.Internal.DoNotApplyLayoutRoundingToMarginsAndBorderThickness=false" />
Aplikacje przeznaczone dla programu .NET Framework 4.6, ale chcą, aby kontrolki WPF były renderowane przy użyciu poprzedniego algorytmu układu, mogą to zrobić, dodając następujący wiersz do <runtime>
sekcji pliku app.config:
<AppContextSwitchOverrides value="Switch.MS.Internal.DoNotApplyLayoutRoundingToMarginsAndBorderThickness=true" />
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6 |
Typ | Przekierowanie |
Języki XML, XSLT
Narzędzie XmlWriter zgłasza nieprawidłowe pary zastępcze
Szczegóły
W przypadku aplikacji przeznaczonych dla programu .NET Framework 4.5.2 lub wcześniejszych wersji pisanie nieprawidłowej pary zastępczej przy użyciu obsługi rezerwowej wyjątku nie zawsze zgłasza wyjątek. W przypadku aplikacji przeznaczonych dla programu .NET Framework 4.6 próba zapisania nieprawidłowej pary zastępczej zgłasza błąd System.ArgumentException.
Sugestia
W razie potrzeby można uniknąć tego przerwania, kierując się do programu .NET Framework 4.5.2 lub starszego. Alternatywnie nieprawidłowe pary zastępcze można wstępnie przetworzyć do prawidłowego pliku XML przed ich zapisaniem.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6 |
Typ | Przekierowanie |
Dotyczy interfejsów API
- XmlWriter.WriteAttributeString(String, String)
- XmlWriter.WriteAttributeString(String, String, String)
- XmlWriter.WriteAttributeString(String, String, String, String)
- XmlWriter.WriteAttributeStringAsync(String, String, String, String)
- XmlWriter.WriteCData(String)
- XmlWriter.WriteCDataAsync(String)
- XmlWriter.WriteChars(Char[], Int32, Int32)
- XmlWriter.WriteCharsAsync(Char[], Int32, Int32)
- XmlWriter.WriteComment(String)
- XmlWriter.WriteCommentAsync(String)
- XmlWriter.WriteEntityRef(String)
- XmlWriter.WriteEntityRefAsync(String)
- XmlWriter.WriteRaw(Char[], Int32, Int32)
- XmlWriter.WriteProcessingInstruction(String, String)
- XmlWriter.WriteProcessingInstructionAsync(String, String)
- XmlWriter.WriteRaw(String)
- XmlWriter.WriteRawAsync(Char[], Int32, Int32)
- XmlWriter.WriteRawAsync(String)
- XmlWriter.WriteString(String)
- XmlWriter.WriteStringAsync(String)
- XmlWriter.WriteSurrogateCharEntity(Char, Char)
- XmlWriter.WriteSurrogateCharEntityAsync(Char, Char)
- XmlWriter.WriteValue(String)
Sprawdzanie poprawności schematu XSD teraz prawidłowo wykrywa naruszenia unikatowych ograniczeń, jeśli używane są klucze złożone, a jeden klucz jest pusty
Szczegóły
Wersje programu .NET Framework wcześniejsze niż 4.6 zawierały usterkę, która spowodowała, że walidacja XSD nie wykryła unikatowych ograniczeń dotyczących kluczy złożonych, jeśli jeden z kluczy był pusty. W programie .NET Framework 4.6 ten problem został poprawiony. Spowoduje to poprawną walidację, ale może również spowodować, że niektóre elementy XML nie zweryfikują, które zostałyby wcześniej zweryfikowane.
Sugestia
Jeśli wymagana jest luźna weryfikacja programu .NET Framework 4.0, walidacja aplikacji może być docelowa w wersji 4.5 (lub starszej) programu .NET Framework. Podczas ponownego pobierania do programu .NET Framework 4.6 należy jednak przeprowadzić przegląd kodu, aby upewnić się, że zduplikowane klucze złożone (zgodnie z opisem tego problemu) nie powinny być weryfikowane.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6 |
Typ | Przekierowanie |
.NET Framework 4.6.1
Podstawowe funkcje
Zmień znak separatora ścieżki we właściwości FullName obiektów ZipArchiveEntry
Szczegóły
W przypadku aplikacji przeznaczonych dla programu .NET Framework 4.6.1 i nowszych wersji znak separatora ścieżki zmienił się z ukośnika odwrotnego ("\") na ukośnik odwrotny ("/") we FullName właściwości ZipArchiveEntry obiektów utworzonych przez przeciążenia CreateFromDirectory metody. Zmiana powoduje, że implementacja platformy .NET jest zgodna z sekcją 4.4.17.1 specyfikacji formatu plików .ZIP i umożliwia dekompresowane archiwa .ZIP w systemach innych niż Windows.
Dekompresowanie pliku zip utworzonego przez aplikację, która jest przeznaczona dla poprzedniej wersji programu .NET Framework w systemach operacyjnych innych niż Windows, takich jak Macintosh, nie może zachować struktury katalogów. Na przykład na komputerze Macintosh tworzy zestaw plików, których nazwa pliku łączy ścieżkę katalogu wraz z dowolnymi znakami ukośnika odwrotnego ("\") i nazwą pliku. W związku z tym struktura katalogów dekompresowanych plików nie jest zachowywana.
Sugestia
Wpływ tej zmiany na pliki .ZIP, które są dekompresowane w systemie operacyjnym Windows przez interfejsy API w przestrzeni nazw programu .NET Framework System.IO , powinny być minimalne, ponieważ te interfejsy API mogą bezproblemowo obsługiwać ukośnik do przodu ("/") lub ukośnik odwrotny ("\") jako znak separatora ścieżki.
Jeśli ta zmiana jest niepożądana, możesz zrezygnować z niej, dodając ustawienie konfiguracji do <runtime>
sekcji pliku konfiguracji aplikacji. W poniższym przykładzie przedstawiono zarówno sekcję, <runtime>
jak i przełącznik rezygnacji Switch.System.IO.Compression.ZipFile.UseBackslash
:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.Compression.ZipFile.UseBackslash=true" />
</runtime>
Ponadto aplikacje przeznaczone dla poprzednich wersji programu .NET Framework, ale są uruchomione w programie .NET Framework 4.6.1 i nowszych wersjach, mogą zdecydować się na to zachowanie, dodając ustawienie konfiguracji do <runtime>
sekcji pliku konfiguracji aplikacji. Poniżej przedstawiono zarówno sekcję, <runtime>
jak i Switch.System.IO.Compression.ZipFile.UseBackslash
przełącznik zgody.
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.Compression.ZipFile.UseBackslash=false" />
</runtime>
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6.1 |
Typ | Przekierowanie |
Dotyczy interfejsów API
- ZipFile.CreateFromDirectory(String, String)
- ZipFile.CreateFromDirectory(String, String, CompressionLevel, Boolean)
- ZipFile.CreateFromDirectory(String, String, CompressionLevel, Boolean, Encoding)
Windows Communication Foundation (WCF)
Powiązanie WCF z trybem zabezpieczeń TransportWithMessageCredential
Szczegóły
Począwszy od programu .NET Framework 4.6.1, powiązanie WCF korzystające z trybu zabezpieczeń TransportWithMessageCredential można skonfigurować do odbierania komunikatów z niepodpisanymi nagłówkami "do" dla kluczy zabezpieczeń asymetrycznych. Domyślnie nagłówki "do" niepodpisane będą nadal odrzucane w programie .NET Framework 4.6.1. Zostaną one zaakceptowane tylko wtedy, gdy aplikacja zdecyduje się na ten nowy tryb działania przy użyciu przełącznika Switch.System.ServiceModel.AllowUnsignedToHeader.
Sugestia
Ponieważ jest to funkcja zgody, nie powinna mieć wpływu na zachowanie istniejących aplikacji.
Aby kontrolować, czy nowe zachowanie jest używane, czy nie, użyj następującego ustawienia konfiguracji:
<runtime>
<AppContextSwitchOverrides value="Switch.System.ServiceModel.AllowUnsignedToHeader=true" />
</runtime>
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Transparent |
Wersja | 4.6.1 |
Typ | Przekierowanie |
Dotyczy interfejsów API
- BasicHttpSecurityMode.TransportWithMessageCredential
- BasicHttpsSecurityMode.TransportWithMessageCredential
- SecurityMode.TransportWithMessageCredential
- WSFederationHttpSecurityMode.TransportWithMessageCredential
X509CertificateClaimSet.FindClaims uwzględnia wszystkie typy oświadczeń
Szczegóły
W aplikacjach przeznaczonych dla programu .NET Framework 4.6.1, jeśli zestaw oświadczeń X509 jest inicjowany z certyfikatu, który ma wiele wpisów DNS w polu SAN, System.IdentityModel.Claims.X509CertificateClaimSet.FindClaims(String, String) metoda próbuje dopasować argument claimType ze wszystkimi wpisami DNS. W przypadku aplikacji przeznaczonych dla poprzednich wersji programu .NET Framework System.IdentityModel.Claims.X509CertificateClaimSet.FindClaims(String, String) metoda próbuje dopasować argument claimType tylko do ostatniego wpisu DNS.
Sugestia
Ta zmiana dotyczy tylko aplikacji przeznaczonych dla programu .NET Framework 4.6.1. Ta zmiana może zostać wyłączona (lub włączona w przypadku określania wartości docelowej przed 4.6.1) z przełącznikiem zgodności DisableMultipleDNSEntries .
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6.1 |
Typ | Przekierowanie |
Dotyczy interfejsów API
Windows Forms
Application.FilterMessage nie zgłasza już ponownie wdrożeń IMessageFilter.PreFilterMessage
Szczegóły
Przed programem .NET Framework 4.6.1 wywołanie metody lub (podczas wywoływania ) spowoduje wywołanie FilterMessage(Message) PreFilterMessage(Message) DoEvents()System.Windows.Forms.Application.AddMessageFilter(IMessageFilter) metody .System.IndexOutOfRangeExceptionSystem.Windows.Forms.Application.RemoveMessageFilter(IMessageFilter)
Począwszy od aplikacji przeznaczonych dla programu .NET Framework 4.6.1, ten wyjątek nie jest już zgłaszany, a filtry ponownego uczestnika zgodnie z powyższym opisem mogą być używane.
Sugestia
Należy pamiętać, że FilterMessage(Message) nie będzie już zgłaszać ponownego zachowania opisanego PreFilterMessage(Message) powyżej. Ma to wpływ tylko na aplikacje przeznaczone dla platformy .NET Framework 4.6.1.Apps przeznaczone dla platformy .NET Framework 4.6.1 mogą zrezygnować z tej zmiany (lub aplikacje przeznaczone dla starszych platform mogą wyrazić zgodę) przy użyciu przełącznika zgodności DontSupportReentrantFilterMessage .
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6.1 |
Typ | Przekierowanie |
Dotyczy interfejsów API
Windows Presentation Foundation (WPF)
Wywołania elementu System.Windows.Input.PenContext.Disable w systemach z obsługą dotykową mogą zgłaszać wyjątek ArgumentException
Szczegóły
W niektórych okolicznościach wywołania wewnętrznej metody System.Windows.Intput.PenContext.Disable w systemach z obsługą dotykową mogą zgłaszać nieobsługiwane T:System.ArgumentException
z powodu ponownego wywołania.
Sugestia
Ten problem został rozwiązany w programie .NET Framework 4.7. Aby zapobiec wyjątkowi, przeprowadź uaktualnienie do wersji programu .NET Framework, począwszy od programu .NET Framework 4.7.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6.1 |
Typ | Przekierowanie |
.NET Framework 4.6.2
ASP.NET
HttpRuntime.AppDomainAppPath zgłasza wyjątek NullReferenceException
Szczegóły
W programie .NET Framework 4.6.2 środowisko uruchomieniowe zgłasza T:System.NullReferenceException
błąd podczas pobierania wartości zawierającej P:System.Web.HttpRuntime.AppDomainAppPath
znaki null. W programie .NET Framework 4.6.1 i starszych wersjach środowisko uruchomieniowe zgłasza błąd T:System.ArgumentNullException
.
Sugestia
Możesz wykonać jedną z następujących czynności, aby odpowiedzieć na tę zmianę:
- Obsługa aplikacji
T:System.NullReferenceException
, jeśli aplikacja jest uruchomiona w programie .NET Framework 4.6.2. - Uaktualnij program do programu .NET Framework 4.7, który przywraca poprzednie zachowanie i zgłasza błąd
T:System.ArgumentNullException
.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6.2 |
Typ | Przekierowanie |
Dotyczy interfejsów API
Podstawowe funkcje
Odszyfrowywanie AesCryptoServiceProvider zapewnia przekształcenie wielokrotnego użytku
Szczegóły
Począwszy od aplikacji przeznaczonych dla programu .NET Framework 4.6.2, AesCryptoServiceProvider odszyfrowywanie zapewnia przekształcenie wielokrotnego użytku. Po wywołaniu System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[], Int32, Int32)metody , transformacja zostanie ponownie zainicjowana i może zostać ponownie użyta. W przypadku aplikacji przeznaczonych dla wcześniejszych wersji programu .NET Framework próba ponownego użycia odszyfrowywania przez wywołanie System.Security.Cryptography.CryptoAPITransform.TransformBlock(Byte[], Int32, Int32, Byte[], Int32) wywołania w celu System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[], Int32, Int32) zgłoszenia CryptographicException lub wygenerowania uszkodzonych danych.
Sugestia
Wpływ tej zmiany powinien być minimalny, ponieważ jest to oczekiwane zachowanie. Aplikacje, które zależą od poprzedniego zachowania, mogą zrezygnować z korzystania z niego, dodając następujące ustawienie konfiguracji do <runtime>
sekcji pliku konfiguracji aplikacji:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.AesCryptoServiceProvider.DontCorrectlyResetDecryptor=true"/>
</runtime>
Ponadto aplikacje przeznaczone dla poprzedniej wersji programu .NET Framework, ale działają w wersji programu .NET Framework, począwszy od programu .NET Framework 4.6.2, mogą wyrazić zgodę, dodając następujące ustawienie konfiguracji do <runtime>
sekcji pliku konfiguracji aplikacji:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.AesCryptoServiceProvider.DontCorrectlyResetDecryptor=false"/>
</runtime>
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6.2 |
Typ | Przekierowanie |
Dotyczy interfejsów API
Wywołania konstruktorów ClaimsIdentity
Szczegóły
Począwszy od programu .NET Framework 4.6.2, istnieje zmiana sposobu, w jaki ClaimsIdentity konstruktory z parametrem System.Security.Principal.IIdentity ustawiają System.Security.Claims.ClaimsIdentity.Actor właściwość . System.Security.Principal.IIdentity Jeśli argument jest obiektemClaimsIdentity, a System.Security.Claims.ClaimsIdentity.Actor właściwość tego ClaimsIdentity obiektu nie null
jest , System.Security.Claims.ClaimsIdentity.Actor właściwość jest dołączona przy użyciu Clone() metody . W programie Framework 4.6.1 i starszych wersjach System.Security.Claims.ClaimsIdentity.Actor właściwość jest dołączona jako istniejące odwołanie. Ze względu na tę zmianę, począwszy od programu .NET Framework 4.6.2, System.Security.Claims.ClaimsIdentity.Actor właściwość nowego ClaimsIdentity obiektu nie jest równa System.Security.Claims.ClaimsIdentity.Actor właściwości argumentu konstruktora System.Security.Principal.IIdentity . W programie .NET Framework 4.6.1 i starszych wersjach jest to równe.
Sugestia
Jeśli to zachowanie jest niepożądane, możesz przywrócić poprzednie zachowanie, ustawiając Switch.System.Security.ClaimsIdentity.SetActorAsReferenceWhenCopyingClaimsIdentity
przełącznik w pliku konfiguracji aplikacji na true
. Wymaga to dodania następujących elementów do <runtime>
sekcji pliku web.config:
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Security.ClaimsIdentity.SetActorAsReferenceWhenCopyingClaimsIdentity=true" />
</runtime>
</configuration>
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6.2 |
Typ | Przekierowanie |
Dotyczy interfejsów API
- ClaimsIdentity(IIdentity)
- ClaimsIdentity(IIdentity, IEnumerable<Claim>)
- ClaimsIdentity(IIdentity, IEnumerable<Claim>, String, String, String)
Zmiany w normalizacji ścieżki
Szczegóły
Począwszy od aplikacji przeznaczonych dla programu .NET Framework 4.6.2, sposób, w jaki środowisko uruchomieniowe normalizuje ścieżki, uległ zmianie. Normalizacja ścieżki polega na zmodyfikowaniu ciągu identyfikującego ścieżkę lub plik, tak aby była zgodna z prawidłową ścieżką w docelowym systemie operacyjnym. Normalizacja zwykle obejmuje:
- Canonicalizing component and directory separators (Kanoniczne separatory składników i katalogów).
- Zastosowanie bieżącego katalogu do ścieżki względnej.
- Ocenianie katalogu względnego (.) lub katalogu nadrzędnego (..) w ścieżce.
- Przycinanie określonych znaków.
Począwszy od aplikacji przeznaczonych dla programu .NET Framework 4.6.2, następujące zmiany w normalizacji ścieżki są domyślnie włączone:
- Środowisko uruchomieniowe odchyli do funkcji GetFullPathName systemu operacyjnego w celu normalizacji ścieżek.
- Normalizacja nie obejmuje już przycinania końca segmentów katalogu (takich jak spacja na końcu nazwy katalogu).
- Obsługa składni ścieżki urządzenia w pełnym zaufaniu, w tym
\\.\
interfejsów API we/wy plików w mscorlib.dll,\\?\
. - Środowisko uruchomieniowe nie weryfikuje ścieżek składni urządzenia.
- Używanie składni urządzenia do uzyskiwania dostępu do alternatywnych strumieni danych jest obsługiwane. Te zmiany zwiększają wydajność, umożliwiając metodom uzyskiwanie dostępu do wcześniej niedostępnych ścieżek. Te zmiany nie mają wpływu na aplikacje przeznaczone dla programu .NET Framework 4.6.1 i starszych wersji, ale działają w programie .NET Framework 4.6.2 lub nowszym.
Sugestia
Aplikacje przeznaczone dla programu .NET Framework 4.6.2 lub nowszego mogą zrezygnować z tej zmiany i korzystać ze starszej normalizacji, dodając następujące informacje do <runtime>
sekcji pliku konfiguracji aplikacji:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=true" />
</runtime>
Aplikacje przeznaczone dla programu .NET Framework 4.6.1 lub starszego, ale są uruchomione w programie .NET Framework 4.6.2 lub nowszym, mogą włączyć zmiany normalizacji ścieżki, dodając następujący wiersz do <runtime>
sekcji pliku konfiguracji aplikacji:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false" />
</runtime>
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6.2 |
Typ | Przekierowanie |
Przepływ CurrentCulture i CurrentUICulture między zadaniami
Szczegóły
Począwszy od programu .NET Framework 4.6 i System.Globalization.CultureInfo.CurrentCulture System.Globalization.CultureInfo.CurrentUICulture są przechowywane w wątku System.Threading.ExecutionContext, który przepływa w operacjach asynchronicznych. Oznacza to, że zmiany lub System.Globalization.CultureInfo.CurrentCulture System.Globalization.CultureInfo.CurrentUICulture zostaną odzwierciedlone w zadaniach, które są później uruchamiane asynchronicznie. Różni się to od zachowania poprzednich wersji programu .NET Framework (co spowoduje zresetowanie System.Globalization.CultureInfo.CurrentCulture i System.Globalization.CultureInfo.CurrentUICulture we wszystkich zadaniach asynchronicznych).
Sugestia
Aplikacje, których dotyczy ta zmiana, mogą obejść ją przez jawne ustawienie żądanej operacji lub System.Globalization.CultureInfo.CurrentUICulture jako pierwszej operacji w asynchronicznych System.Globalization.CultureInfo.CurrentCulture zadaniach. Alternatywnie stare zachowanie (nie przepływające System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) może zostać wybrane przez ustawienie następującego przełącznika zgodności:
AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);
Ten problem został rozwiązany przez WPF w programie .NET Framework 4.6.2. Naprawiono ją również w programach .NET Framework 4.6, 4.6.1 do KB 3139549. Aplikacje przeznaczone dla platformy .NET Framework 4.6 lub nowszej automatycznie uzyskają odpowiednie zachowanie w aplikacjach WPF — System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) zostaną zachowane w operacjach dyspozytora.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6 |
Typ | Przekierowanie |
Dotyczy interfejsów API
- CultureInfo.CurrentCulture
- Thread.CurrentCulture
- CultureInfo.CurrentUICulture
- Thread.CurrentUICulture
Nazwy zdarzeń ETW nie mogą się różnić tylko od sufiksu "Start" lub "Stop"
Szczegóły
W programach .NET Framework 4.6 i 4.6.1 środowisko uruchomieniowe zgłasza ArgumentException błąd, gdy dwie nazwy zdarzeń śledzenia zdarzeń systemu Windows (ETW) różnią się tylko sufiksem "Uruchom" lub "Zatrzymaj" (tak jak w przypadku, gdy jedno zdarzenie ma nazwę LogUser
, a inne ma nazwę LogUserStart
). W takim przypadku środowisko uruchomieniowe nie może skonstruować źródła zdarzeń, które nie może emitować żadnego rejestrowania.
Sugestia
Aby zapobiec wyjątkowi, upewnij się, że żadne dwie nazwy zdarzeń nie różnią się tylko sufiksem "Start" lub "Stop". To wymaganie jest usuwane, począwszy od programu .NET Framework 4.6.2; środowisko uruchomieniowe może uściślać nazwy zdarzeń, które różnią się tylko sufiksem "Start" i "Stop".
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6 |
Typ | Przekierowanie |
Obsługa długich ścieżek
Szczegóły
Począwszy od aplikacji przeznaczonych dla programu .NET Framework 4.6.2, obsługiwane są długie ścieżki (maksymalnie 32K), a ograniczenie długości ścieżek 260 znaków (lub MAX_PATH
) zostało usunięte. W przypadku aplikacji, które zostały ponownie skompilowane w celu kierowania programu .NET Framework 4.6.2, ścieżki kodu, które wcześniej rzuciły element, System.IO.PathTooLongException ponieważ ścieżka przekroczyła 260 znaków, będzie teraz zgłaszać System.IO.PathTooLongException tylko następujące warunki:
- Długość ścieżki jest większa niż MaxValue (32 767 znaków).
- System operacyjny zwraca
COR_E_PATHTOOLONG
lub jego odpowiednik. W przypadku aplikacji przeznaczonych dla platformy .NET Framework 4.6.1 i starszych wersji środowisko uruchomieniowe automatycznie zgłasza wyjątek System.IO.PathTooLongException za każdym razem, gdy ścieżka przekracza 260 znaków.
Sugestia
W przypadku aplikacji przeznaczonych dla programu .NET Framework 4.6.2 możesz zrezygnować z obsługi długiej ścieżki, jeśli nie jest to pożądane, dodając następujący kod do <runtime>
sekcji app.config
pliku:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.BlockLongPaths=true" />
</runtime>
W przypadku aplikacji przeznaczonych dla starszych wersji programu .NET Framework, ale uruchamianych w programie .NET Framework 4.6.2 lub nowszym, możesz wyrazić zgodę na obsługę długiej ścieżki, dodając następujące informacje do <runtime>
sekcji app.config
pliku:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.BlockLongPaths=false" />
</runtime>
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6.2 |
Typ | Przekierowanie |
Kontrole dwukropka ścieżki są bardziej rygorystyczne
Szczegóły
W programie .NET Framework 4.6.2 wprowadzono wiele zmian w celu obsługi wcześniej nieobsługiwanych ścieżek (zarówno długości, jak i formatu). Sprawdzanie prawidłowej składni separatora dysku (dwukropka) zostało poprawione, co miało efekt uboczny blokowania niektórych ścieżek identyfikatora URI w kilku wybranych interfejsach API ścieżki, w których wcześniej były tolerowane.
Sugestia
W przypadku przekazania identyfikatora URI do dotkniętych interfejsów API najpierw zmodyfikuj ciąg, aby był ścieżką prawną.
Usuń schemat z adresów URL ręcznie (na przykład usuń
file://
z adresów URL).Przekaż identyfikator URI do Uri klasy i użyj polecenia LocalPath.
Alternatywnie możesz zrezygnować z nowej normalizacji ścieżki, ustawiając Switch.System.IO.UseLegacyPathHandling
przełącznik AppContext na true
.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6.2 |
Typ | Przekierowanie |
Dotyczy interfejsów API
Zabezpieczenia
RsACng teraz poprawnie ładuje klucze RSA o niestandardowym rozmiarze klucza
Szczegóły
W wersjach programu .NET Framework wcześniejszych niż 4.6.2 klienci z niestandardowymi rozmiarami kluczy dla certyfikatów RSA nie mogą uzyskać dostępu do tych kluczy za pośrednictwem System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPublicKey(X509Certificate2) metod i System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPrivateKey(X509Certificate2) rozszerzenia. Komunikat System.Security.Cryptography.CryptographicException "Żądany rozmiar klucza nie jest obsługiwany" jest zgłaszany. W programie .NET Framework 4.6.2 ten problem został rozwiązany. Podobnie i ImportParameters(RSAParameters) ImportParameters(RSAParameters) teraz działają z niestandardowymi rozmiarami kluczy bez zgłaszania elementu System.Security.Cryptography.CryptographicException.
Sugestia
Jeśli istnieje logika obsługi wyjątków, która opiera się na poprzednim zachowaniu, w którym System.Security.Cryptography.CryptographicException jest zgłaszany podczas użycia niestandardowych rozmiarów kluczy, rozważ usunięcie logiki.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6.2 |
Typ | Przekierowanie |
Dotyczy interfejsów API
- RSA.ImportParameters(RSAParameters)
- RSACng.ImportParameters(RSAParameters)
- RSACertificateExtensions.GetRSAPrivateKey(X509Certificate2)
- RSACertificateExtensions.GetRSAPublicKey(X509Certificate2)
SignedXml.GetPublicKey zwraca rsACng na net462 (lub lightup) bez zmiany retargeting
Szczegóły
Począwszy od programu .NET Framework 4.6.2, konkretny typ obiektu zwrócony przez SignedXml.GetPublicKey metodę został zmieniony (bez dziwactwa) z implementacji CryptoServiceProvider do implementacji Cng. Jest to spowodowane tym, że implementacja zmieniła się z użycia certificate.PublicKey.Key
na użycie wewnętrznego certificate.GetAnyPublicKey
, które przekazuje do elementu RSACertificateExtensions.GetRSAPublicKey.
Sugestia
Począwszy od aplikacji uruchomionych w programie .NET Framework 4.7.1, możesz użyć implementacji CryptoServiceProvider używanej domyślnie w programie .NET Framework 4.6.1 i starszych wersjach, dodając następujący przełącznik konfiguracji do sekcji środowiska uruchomieniowego pliku konfiguracji aplikacji:
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.SignedXmlUseLegacyCertificatePrivateKey=true" />
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6.2 |
Typ | Przekierowanie |
Dotyczy interfejsów API
Windows Communication Foundation (WCF)
Zakleszczenie może spowodować użycie usług reentrant
Szczegóły
Zakleszczenie może spowodować wystąpienie usługi Reentrant, która jednocześnie ogranicza wystąpienia usługi do jednego wątku wykonywania. Usługi podatne na ten problem będą miały następujące elementy ServiceBehaviorAttribute w kodzie:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
Sugestia
Aby rozwiązać ten problem, możesz wykonać następujące czynności:
- Ustaw tryb współbieżności usługi na ConcurrencyMode.Single wartość lub ConcurrencyMode.Multiple. Na przykład:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
- Zainstaluj najnowszą aktualizację programu .NET Framework 4.6.2 lub uaktualnij ją do nowszej wersji programu .NET Framework. Spowoduje to wyłączenie przepływu w elem.ExecutionContext OperationContext.Current To zachowanie można skonfigurować; Jest to równoważne dodaniu następującego ustawienia aplikacji do pliku konfiguracji:
<appSettings>
<add key="Switch.System.ServiceModel.DisableOperationContextAsyncFlow" value="true" />
</appSettings>
Wartość parametru Switch.System.ServiceModel.DisableOperationContextAsyncFlow
nigdy nie powinna być ustawiona na false
wartość dla usług Reentrant.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6.2 |
Typ | Przekierowanie |
Dotyczy interfejsów API
OperationContext.Current może zwracać wartość null, gdy jest wywoływana w klauzuli using
Szczegóły
OperationContext.Current może zwrócić wartość null
i może NullReferenceException spowodować, że wszystkie następujące warunki są spełnione:
- Pobierasz wartość OperationContext.Current właściwości w metodzie zwracającej obiekt Task lub Task<TResult>.
- Wystąpienie obiektu należy utworzyć OperationContextScope w klauzuli
using
. - Pobierasz wartość OperationContext.Current właściwości w obiekcie
using statement
. Na przykład:
using (new OperationContextScope(OperationContext.Current))
{
// OperationContext.Current is null.
OperationContext context = OperationContext.Current;
// ...
}
Sugestia
Aby rozwiązać ten problem, możesz wykonać następujące czynności:
Zmodyfikuj kod w następujący sposób, aby utworzyć wystąpienie nowego obiektu innego niż:
null
CurrentOperationContext ocx = OperationContext.Current; using (new OperationContextScope(OperationContext.Current)) { OperationContext.Current = new OperationContext(ocx.Channel); // ... }
Zainstaluj najnowszą aktualizację programu .NET Framework 4.6.2 lub uaktualnij ją do nowszej wersji programu .NET Framework. Spowoduje to wyłączenie przepływu ExecutionContext elementu w OperationContext.Current systemie i przywrócenie zachowania aplikacji WCF w programie .NET Framework 4.6.1 i starszych wersjach. To zachowanie można skonfigurować; Jest to równoważne dodaniu następującego ustawienia aplikacji do pliku konfiguracji:
<appSettings> <add key="Switch.System.ServiceModel.DisableOperationContextAsyncFlow" value="true" /> </appSettings>
Jeśli ta zmiana jest niepożądana, a aplikacja zależy od kontekstu wykonywania przepływającego między kontekstami operacji, możesz włączyć jej przepływ w następujący sposób:
<appSettings> <add key="Switch.System.ServiceModel.DisableOperationContextAsyncFlow" value="false" /> </appSettings>
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6.2 |
Typ | Przekierowanie |
Dotyczy interfejsów API
Zabezpieczenia transportu WCF obsługują certyfikaty przechowywane przy użyciu CNG
Szczegóły
Począwszy od aplikacji przeznaczonych dla programu .NET Framework 4.6.2, zabezpieczenia transportu WCF obsługują certyfikaty przechowywane przy użyciu biblioteki kryptograficznej systemu Windows (CNG). Ta obsługa jest ograniczona do certyfikatów z kluczem publicznym, który ma wykładnik nie więcej niż 32 bity długości. Gdy aplikacja jest przeznaczona dla programu .NET Framework 4.6.2, ta funkcja jest domyślnie włączona. We wcześniejszych wersjach programu .NET Framework próba użycia certyfikatów X509 u dostawcy magazynu kluczy CSG zgłasza wyjątek.
Sugestia
Aplikacje przeznaczone dla platformy .NET Framework 4.6.1 lub starszej, ale są uruchomione w programie .NET Framework 4.6.2, mogą włączyć obsługę certyfikatów CNG, dodając następujący wiersz do <runtime>
sekcji pliku app.config lub web.config:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IdentityModel.DisableCngCertificates=false" />
</runtime>
Można to również zrobić programowo za pomocą następującego kodu:
private const string DisableCngCertificates = @"Switch.System.IdentityModel.DisableCngCertificate";
AppContext.SetSwitch(disableCngCertificates, false);
Const DisableCngCertificates As String = "Switch.System.IdentityModel.DisableCngCertificates"
AppContext.SetSwitch(disableCngCertificates, False)
Należy pamiętać, że ze względu na tę zmianę każdy kod obsługi wyjątków, który zależy od próby zainicjowania bezpiecznej komunikacji z certyfikatem CNG, który zakończy się niepowodzeniem, nie będzie już wykonywany.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6.2 |
Typ | Przekierowanie |
Windows Forms
Niepoprawna implementacja elementu MemberDescriptor.Equals
Szczegóły
Oryginalna implementacja MemberDescriptor.Equals metody porównuje dwie różne właściwości ciągu z porównywanych obiektów: nazwę kategorii i ciąg opisu. Poprawka polega na porównaniu Category pierwszego obiektu z Category drugim, a Description z pierwszego do Description drugiego.
Sugestia
Jeśli aplikacja zależy od MemberDescriptor.Equals czasami zwracania false
, gdy deskryptory są równoważne, a docelową wersją programu .NET Framework 4.6.2 lub nowszą jest kilka opcji:
- Wprowadź zmiany kodu, aby ręcznie porównać Category pola i Description oprócz wywołania MemberDescriptor.Equals metody .
- Zrezygnuj z tej zmiany, dodając następującą wartość do pliku app.config:
<runtime>
<AppContextSwitchOverrides value="Switch.System.MemberDescriptorEqualsReturnsFalseIfEquivalent=true" />
</runtime>
Jeśli aplikacja jest przeznaczona dla programu .NET Framework 4.6.1 lub starszego i działa w programie .NET Framework 4.6.2 lub nowszym i chcesz włączyć tę zmianę, możesz ustawić przełącznik false
zgodności na, dodając następującą wartość do pliku app.config:
<runtime>
<AppContextSwitchOverrides value="Switch.System.MemberDescriptorEqualsReturnsFalseIfEquivalent=false" />
</runtime>
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Edge |
Wersja | 4.6.2 |
Typ | Przekierowanie |
Dotyczy interfejsów API
Windows Presentation Foundation (WPF)
CurrentCulture nie jest zachowywana w operacjach dyspozytora WPF
Szczegóły
Począwszy od programu .NET Framework 4.6, zmiany lub System.Globalization.CultureInfo.CurrentCulture System.Globalization.CultureInfo.CurrentUICulture wprowadzone w ramach elementu System.Windows.Threading.Dispatcher zostaną utracone na końcu tej operacji dyspozytora. Podobnie zmiany operacji System.Globalization.CultureInfo.CurrentCulture dyspozytora lub System.Globalization.CultureInfo.CurrentUICulture wprowadzone poza operacją dyspozytora mogą nie zostać odzwierciedlone podczas wykonywania tej operacji. Praktycznie oznacza to, że System.Globalization.CultureInfo.CurrentCulture i System.Globalization.CultureInfo.CurrentUICulture zmiany mogą nie przepływać między wywołaniami zwrotnymi interfejsu użytkownika WPF a innym kodem w aplikacji WPF. Jest to spowodowane zmianą, System.Threading.ExecutionContext która powoduje System.Globalization.CultureInfo.CurrentCulture i System.Globalization.CultureInfo.CurrentUICulture jest przechowywana w kontekście wykonywania, począwszy od aplikacji przeznaczonych dla programu .NET Framework 4.6. Operacje dyspozytora WPF przechowują kontekst wykonywania używany do rozpoczęcia operacji i przywracania poprzedniego kontekstu po zakończeniu operacji. Ponieważ System.Globalization.CultureInfo.CurrentCulture i System.Globalization.CultureInfo.CurrentUICulture są teraz częścią tego kontekstu, zmiany w nich w ramach operacji dyspozytora nie są utrwalane poza operacją.
Sugestia
Aplikacje, których dotyczy ta zmiana, mogą obejść ten problem, przechowując żądane System.Globalization.CultureInfo.CurrentCulture lub System.Globalization.CultureInfo.CurrentUICulture w polu i sprawdzając wszystkie jednostki operacji dyspozytora (w tym programy obsługi wywołania zwrotnego zdarzeń interfejsu użytkownika), które są poprawne System.Globalization.CultureInfo.CurrentCulture i System.Globalization.CultureInfo.CurrentUICulture ustawione. Alternatywnie, ponieważ zmiana ExecutionContext bazowa tej zmiany WPF dotyczy tylko aplikacji przeznaczonych dla platformy .NET Framework 4.6 lub nowszej, tej przerwy można uniknąć przez ustawienie przełącznika zgodności programu .NET Framework 4.5.2.Apps, które są przeznaczone dla platformy .NET Framework 4.6 lub nowszej, można również obejść ten problem, ustawiając następujący przełącznik zgodności:
AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);
Ten problem został rozwiązany przez WPF w programie .NET Framework 4.6.2. Naprawiono ją również w programach .NET Framework 4.6, 4.6.1 do KB 3139549. Aplikacje przeznaczone dla platformy .NET Framework 4.6 lub nowszej automatycznie uzyskają odpowiednie zachowanie w aplikacjach WPF — System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) zostaną zachowane w operacjach dyspozytora.
Nazwa/nazwisko | Wartość |
---|---|
Zakres | Mały |
Wersja | 4.6 |
Typ | Przekierowanie |