Udostępnij za pośrednictwem


Zmiany przekierowań w ramach migracji do .NET Framework 4.7.x

W tym artykule wymieniono problemy ze zgodnością aplikacji wprowadzone w programie .NET Framework 4.7, 4.7.1i 4.7.2.

.NET Framework 4.7

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 podczas pobierania wartości P:System.Web.HttpRuntime.AppDomainAppPath zawierającej znaki null. W programie .NET Framework 4.6.1 i starszych wersjach środowisko uruchomieniowe zgłasza T:System.ArgumentNullException.

Sugestia

Możesz wykonać jedną z następujących czynności, aby odpowiedzieć na tę zmianę:

  • Zajmij się T:System.NullReferenceException, jeśli aplikacja działa na platformie .NET Framework 4.6.2.
  • Zaktualizuj do .NET Framework 4.7, który przywraca poprzednie zachowanie i zgłasza T:System.ArgumentNullException.
Nazwa Wartość
Zakres Edge
Wersja 4.6.2
Typ Retargetowanie

Interfejsy API, których dotyczy problem

Ogranicz współbieżne żądania na sesję

Szczegóły

W programie .NET Framework 4.6.2 i starszych ASP.NET wykonuje żądania z tym samym identyfikatorem sesji sekwencyjnie, a ASP.NET zawsze wysyła identyfikator sessionid za pośrednictwem plików cookie domyślnie. Jeśli odpowiedź strony trwa długo, to naciśnięcie F5 w przeglądarce znacznie obniży wydajność serwera. W poprawce dodaliśmy licznik do śledzenia żądań w kolejce i przerywania żądań po przekroczeniu określonego limitu. Wartość domyślna to 50. Jeśli limit zostanie osiągnięty, w dzienniku zdarzeń zostanie zarejestrowane ostrzeżenie, a w dzienniku usług IIS może zostać zarejestrowana odpowiedź HTTP 500.

Sugestia

Aby przywrócić stare zachowanie, możesz dodać następujące ustawienie do pliku web.config, aby zrezygnować z nowego zachowania.

<appSettings>
    <add key="aspnet:RequestQueueLimitPerSession" value="2147483647"/>
</appSettings>
Nazwa Wartość
Zakres Krawędź
Wersja 4.7
Typ Ponowne targetowanie

Sieciowanie

Domyślną wartością elementu ServicePointManager.SecurityProtocol jest SecurityProtocolType.System.Default.

Szczegóły

Począwszy od aplikacji przeznaczonych dla programu .NET Framework 4.7, domyślną wartością właściwości ServicePointManager.SecurityProtocol jest SecurityProtocolType.SystemDefault. Ta zmiana umożliwia interfejsom API sieci programu .NET Framework opartym na protokole SslStream (takim jak FTP, HTTPS i SMTP) dziedziczenie domyślnych protokołów zabezpieczeń z systemu operacyjnego zamiast używania ustalonych wartości zdefiniowanych przez program .NET Framework. Wartość domyślna zależy od systemu operacyjnego i dowolnej niestandardowej konfiguracji wykonywanej przez administratora systemu. Aby uzyskać informacje na temat domyślnego protokołu SChannel w każdej wersji systemu operacyjnego Windows, zobacz Protocols in TLS/SSL (SCHANNEL SSP).

W przypadku aplikacji przeznaczonych dla starszej wersji programu .NET Framework domyślna wartość właściwości ServicePointManager.SecurityProtocol zależy od wersji docelowej programu .NET Framework. Aby uzyskać więcej informacji, zobacz sekcję Sieciowanie w artykule Zmiany w celu przełączenia przy migracji z .NET Framework 4.5.2 do 4.6.

Sugestia

Ta zmiana dotyczy aplikacji przeznaczonych dla programu .NET Framework w wersji 4.7 lub nowszej. Jeśli wolisz używać zdefiniowanego protokołu zamiast polegać na domyślnym systemie, możesz jawnie ustawić wartość właściwości ServicePointManager.SecurityProtocol. Jeśli ta zmiana jest niepożądana, możesz zrezygnować z niej, dodając ustawienie konfiguracji do sekcji środowiska uruchomieniowego pliku konfiguracji aplikacji. W poniższym przykładzie pokazano zarówno sekcję <runtime>, jak i przełącznik umożliwiający rezygnację Switch.System.Net.DontEnableSystemDefaultTlsVersions.

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=true" />
</runtime>
Nazwa Wartość
Zakres Małoletni
Wersja 4.7
Typ Retargeting (ponowne kierowanie reklam)

Interfejsy API, których dotyczy problem

Usługa SslStream obsługuje alerty TLS

Szczegóły

Po nieudanym uzgadnianiu protokołu TLS pierwsza operacja odczytu/zapisu we/wy zgłosi wyjątek System.IO.IOException z wewnętrznym System.ComponentModel.Win32Exception. Kod System.ComponentModel.Win32Exception.NativeErrorCode dla System.ComponentModel.Win32Exception można przypisać do alertu TLS pochodzącego od zdalnej strony przy użyciu kodów błędów Schannel dla alertów TLS i SSL. Aby uzyskać więcej informacji, zobacz RFC 2246: Sekcja 7.2.2 alerty dotyczące błędów.
Zachowanie w programie .NET Framework 4.6.2 lub starszym polega na tym, że kanał transportu (zazwyczaj połączenie TCP) upłynął limit czasu podczas zapisu lub odczytu, jeśli inna strona nie powiodła się uzgadniania, a następnie natychmiast potem odrzucił połączenie.

Sugestia

Aplikacje wywołujące interfejsy API we/wy sieci, takie jak Read(Byte[], Int32, Int32)/Write(Byte[], Int32, Int32), powinny obsługiwać IOException lub System.TimeoutException.
Funkcja alertów TLS jest domyślnie włączona, począwszy od programu .NET Framework 4.7. Aplikacje przeznaczone dla wersji programu .NET Framework z wersji od 4.0 do 4.6.2 działającej w systemie .NET Framework 4.7 lub nowszym będą miały wyłączoną funkcję w celu zachowania zgodności.
Następujący interfejs API konfiguracji jest dostępny do włączania lub wyłączania funkcji dla aplikacji .NET Framework 4.6 lub nowszych działających na platformie .NET Framework 4.7 lub nowszej.

  • Programowo: Musi być pierwszą rzeczą, jaką aplikacja wykonuje, ponieważ program ServicePointManager zainicjuje tylko raz:

    AppContext.SetSwitch("TestSwitch.LocalAppContext.DisableCaching", true);
    
    // Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2.
    AppContext.SetSwitch("Switch.System.Net.DontEnableTlsAlerts", true);
    
  • AppConfig:

    <runtime>
      <AppContextSwitchOverrides value="Switch.System.Net.DontEnableTlsAlerts=true"/>
      <!-- Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2. -->
    </runtime>
    
  • Klucz rejestru (globalny dla maszyny): ustaw wartość na false, aby włączyć funkcję w .NET Framework 4.6 - 4.6.2.

    Key: HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext\Switch.System.Net.DontEnableTlsAlerts
    - Type: String
    - Value: "true"
    
Nazwa Wartość
Zakres Krawędź
Wersja 4.7
Typ Retargeting

Interfejsy API, których dotyczy problem

Bezpieczeństwo

CspParameters.ParentWindowHandle oczekuje teraz wartości HWND

Szczegóły

Wartość ParentWindowHandle, wprowadzona w .NET Framework 2.0, umożliwia aplikacji zarejestrowanie wartości uchwytu okna nadrzędnego, tak aby każdy interfejs użytkownika wymagany do uzyskania dostępu do klucza (na przykład monit o podanie numeru PIN lub okno dialogowe zgody) otwierał się jako modalne okno podrzędne dla określonego okna. Począwszy od aplikacji przeznaczonych dla platformy .NET Framework 4.7, aplikacja Windows Forms może ustawić właściwość ParentWindowHandle za pomocą następującego kodu:

cspParameters.ParentWindowHandle = form.Handle;

W poprzednich wersjach programu .NET Framework oczekiwano, że wartość będzie System.IntPtr reprezentującą lokalizację w pamięci, w której znajduje się wartość HWND. Ustawienie właściwości na form.Handle w systemie Windows 7 i wcześniejszych wersjach nie miało żadnego wpływu, ale w systemie Windows 8 i nowszych wersjach powoduje błąd "System.Security.Cryptography.CryptographicException: parametr jest niepoprawny".

Sugestia

Aplikacje przeznaczone dla platformy .NET Framework 4.7 lub nowszej, chcące zarejestrować relację okna nadrzędnego, są zachęcane do korzystania z uproszczonego formularza.

cspParameters.ParentWindowHandle = form.Handle;

Użytkownicy, którzy ustalili, że prawidłową wartością do przekazania była adres lokalizacji pamięci, która przechowywała wartość form.Handle może zrezygnować ze zmiany zachowania, ustawiając przełącznik AppContext Switch.System.Security.Cryptography.DoNotAddrOfCspParentWindowHandle na true:

  • Programowe ustawianie przełączników zgodności dla elementu AppContext, jak wyjaśniono tutaj.
  • Przez dodanie następującego wiersza do sekcji <runtime> w pliku app.config:
<runtime>
 <AppContextSwitchOverrides value="Switch.System.Security.Cryptography.DoNotAddrOfCspParentWindowHandle=true"/>
</runtime>

Z drugiej strony użytkownicy, którzy chcą wyrazić zgodę na nowe zachowanie w środowisku uruchomieniowym programu .NET Framework 4.7, gdy aplikacja ładuje się w starszych wersjach programu .NET Framework, mogą ustawić przełącznik AppContext na false.

Nazwa Wartość
Zakres Małoletni
Wersja 4.7
Typ Retargeting

Interfejsy API, których dotyczy problem

Usługa SslStream obsługuje alerty TLS

Szczegóły

Po nieudanym uzgadnianiu protokołu TLS, pierwsza operacja odczytu/zapisu wejścia/wyjścia spowoduje wyrzucenie System.IO.IOException z wewnętrznym wyjątkiem System.ComponentModel.Win32Exception. Kod System.ComponentModel.Win32Exception.NativeErrorCode dla System.ComponentModel.Win32Exception można przyporządkować do alertu TLS od strony zdalnej, używając kodów błędów Schannel dla ostrzeżeń TLS i SSL. Aby uzyskać więcej informacji, zobacz RFC 2246: Sekcja 7.2.2 Ostrzeżenia o błędach.
Zachowanie w programie .NET Framework 4.6.2 lub starszym polega na tym, że kanał transportu (zazwyczaj połączenie TCP) upłynął limit czasu podczas zapisu lub odczytu, jeśli inna strona nie powiodła się uzgadniania, a następnie natychmiast potem odrzucił połączenie.

Sugestia

Aplikacje wywołujące interfejsy API we/wy sieci, takie jak Read(Byte[], Int32, Int32)/Write(Byte[], Int32, Int32), powinny obsługiwać IOException lub System.TimeoutException.
Funkcja alertów TLS jest domyślnie włączona, począwszy od programu .NET Framework 4.7. Aplikacje przeznaczone dla wersji programu .NET Framework z wersji od 4.0 do 4.6.2 działającej w systemie .NET Framework 4.7 lub nowszym będą miały wyłączoną funkcję w celu zachowania zgodności.
Następujący interfejs API konfiguracji jest dostępny do włączania lub wyłączania funkcji dla aplikacji .NET Framework 4.6 lub nowszych działających na platformie .NET Framework 4.7 lub nowszej.

  • Programowo: Musi być pierwszą rzeczą, jaką aplikacja wykonuje, ponieważ program ServicePointManager zainicjuje tylko raz:

    AppContext.SetSwitch("TestSwitch.LocalAppContext.DisableCaching", true);
    
    // Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2.
    AppContext.SetSwitch("Switch.System.Net.DontEnableTlsAlerts", true);
    
  • AppConfig:

    <runtime>
      <AppContextSwitchOverrides value="Switch.System.Net.DontEnableTlsAlerts=true"/>
      <!-- Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2. -->
    </runtime>
    
  • Klucz rejestru (globalny dla maszyny): ustaw wartość na false, aby włączyć funkcję w .NET Framework 4.6 – 4.6.2.

    Key: HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext\Switch.System.Net.DontEnableTlsAlerts
    - Type: String
    - Value: "true"
    
Nazwa Wartość
Zakres Edge
Wersja 4.7
Typ Retargeting

Interfejsy API, których dotyczy problem

Windows Communication Foundation (WCF)

Serializacja znaków kontrolnych za pomocą klasy DataContractJsonSerializer jest teraz zgodna z programem ECMAScript V6 i V8

Szczegóły

W programie .NET Framework 4.6.2 i starszych wersjach System.Runtime.Serialization.Json.DataContractJsonSerializer nie serializował niektórych specjalnych znaków kontrolnych, takich jak \b, \f i \t, w sposób zgodny ze standardami ECMAScript V6 i V8. Począwszy od programu .NET Framework 4.7, serializacja tych znaków sterujących jest zgodna z programem ECMAScript V6 i V8.

Sugestia

W przypadku aplikacji przeznaczonych dla programu .NET Framework 4.7 ta funkcja jest domyślnie włączona. Jeśli to zachowanie nie jest pożądane, możesz zrezygnować z tej funkcji, dodając następujący wiersz do sekcji <runtime> pliku app.config lub web.config:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Runtime.Serialization.DoNotUseECMAScriptV6EscapeControlCharacter=false" />
</runtime>
Nazwa Wartość
Zakres Edge
Wersja 4.7
Typ Remarketing

Interfejsy API, których dotyczy problem

Zabezpieczenia komunikatów programu WCF mogą teraz używać protokołów TLS1.1 i TLS1.2

Szczegóły

Począwszy od programu .NET Framework 4.7, klienci mogą konfigurować protokoły TLS1.1 lub TLS1.2 w zabezpieczeniach komunikatów WCF oprócz protokołów SSL3.0 i TLS1.0 za pośrednictwem ustawień konfiguracji aplikacji.

Sugestia

W programie .NET Framework 4.7 obsługa protokołów TLS1.1 i TLS1.2 w zabezpieczeniach komunikatów WCF jest domyślnie wyłączona. Możesz ją włączyć, dodając następujący wiersz do sekcji <runtime> pliku app.config lub web.config:

<runtime>
<AppContextSwitchOverrides value="Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols=false;Switch.System.Net.DontEnableSchUseStrongCrypto=false" />
</runtime>
Nazwa Wartość
Zakres Edge
Wersja 4.7
Typ Retargeting (retargetowanie)

Windows Presentation Foundation (WPF)

Wywołania metody System.Windows.Input.PenContext.Disable na systemach z obsługą dotykową mogą zgłaszać wyjątek ArgumentException.

Szczegóły

W niektórych okolicznościach wywołania metody wewnętrznej 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 Wartość
Zakres Krawędź
Wersja 4.6.1
Typ Retargeting

NullReferenceException w kodzie obsługi wyjątków w ImageSourceConverter.ConvertFrom

Szczegóły

Błąd w kodzie obsługi wyjątków dla ConvertFrom(ITypeDescriptorContext, CultureInfo, Object) spowodował, że został rzucony niepoprawny System.NullReferenceException zamiast zamierzonego wyjątku (System.IO.DirectoryNotFoundException lub System.IO.FileNotFoundException). Ta zmiana poprawia ten błąd, tak aby metoda zgłaszała teraz właściwy wyjątek.

Domyślnie wszystkie aplikacje przeznaczone dla platformy .NET Framework 4.6.2 i starszych nadal zgłaszają błąd System.NullReferenceException pod kątem zgodności. Deweloperzy korzystający z programu .NET Framework 4.7 lub nowszego powinni widzieć odpowiednie wyjątki.

Sugestia

Deweloperzy, którzy chcą przywrócić System.NullReferenceException przy korzystaniu z .NET Framework 4.7 lub nowszego, mogą dodać/scalić następujące elementy do pliku App.config swojej aplikacji:

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Media.ImageSourceConverter.OverrideExceptionWithNullReferenceException=true"/>
</runtime>
</configuration>
Nazwa Wartość
Zakres Krawędź
Wersja 4.7
Typ Retargeting

Interfejsy API, których dotyczy problem

Alokacja miejsca w siatce WPF dla kolumn gwiazdowych

Szczegóły

Począwszy od programu .NET Framework 4.7, WPF zastępuje algorytm, który Grid używa do przydzielenia miejsca do *-columns. Spowoduje to zmianę rzeczywistej szerokości przypisanej do *-columns w wielu przypadkach:

  • Jeśli jedna lub więcej kolumn *- ma minimalną lub maksymalną szerokość, która nadpisuje proporcjonalną alokację dla tej kolumny. (Minimalna szerokość może pochodzić z jawnej deklaracji MinWidth lub niejawnego minimum uzyskanego z zawartości kolumny. Maksymalna szerokość można zdefiniować jawnie tylko z deklaracji MaxWidth.
  • Jeśli co najmniej jedna kolumna *-deklaruje bardzo dużą wagę *, większą niż 10^298.
  • Gdy *-wagi są wystarczająco różne, aby napotkać niestabilność zmiennoprzecinkowa (przepełnienie, niedopełnienie, utrata precyzji).
  • Po włączeniu zaokrąglania układu, a efektywna rozdzielczość DPI wyświetlacza jest wystarczająco wysoka. W pierwszych dwóch przypadkach szerokość wygenerowana przez nowy algorytm może znacznie różnić się od tych generowanych przez stary algorytm; w ostatnim przypadku różnica będzie wynosić co najwyżej jeden lub dwa piksele.

Nowy algorytm naprawia kilka usterek obecnych w starym algorytmie:

  • Łączna alokacja kolumn może przekraczać szerokość siatki. Taka sytuacja może wystąpić przy przydzielaniu miejsca dla kolumny, której udział w rozdziale proporcjonalnym jest mniejszy niż jej minimalny rozmiar. Algorytm przydziela minimalny rozmiar, co zmniejsza ilość miejsca dostępnego dla innych kolumn. Jeśli nie ma kolumn *do przydzielenia, łączna alokacja będzie zbyt duża.

  • Łączna alokacja może być mniejsza niż szerokość siatki. Jest to problem dualny do #1, który pojawia się podczas przydzielania do kolumny, której udział proporcjonalny jest większy niż jej maksymalny rozmiar, bez pozostawionych *-kolumn do wyrównania różnicy.

  • Dwie *-kolumny mogą odbierać alokacje nieproporcjonalne względem ich *-wag. Jest to łagodniejsza wersja #1/#2, wynikająca z przydziału do *-kolumn A, B i C (w tej kolejności), gdzie proporcjonalny udział B narusza jego ograniczenie minimalne (lub maksymalne). Jak powyżej, zmienia to miejsce dostępne dla kolumny C, która otrzymuje mniej (lub więcej) proporcjonalnej alokacji niż A.

  • Kolumny o bardzo dużych wagach (> 10^298) są traktowane tak, jakby miały wagę 10^298. Proporcjonalne różnice między nimi (i między kolumnami z nieco mniejszymi wagami) nie są uznawane.

  • Kolumny o nieskończonych wagach nie są poprawnie obsługiwane. (W rzeczywistości nie można ustawić wagi na Nieskończoność, ale jest to sztuczne ograniczenie. Kod alokacji próbował go obsłużyć, ale wykonywał złe zadanie).

  • Kilka drobnych problemów podczas unikania przepełnienia, niedomiaru, utraty precyzji i podobnych problemów zmiennoprzecinkowych.

  • Korekty zaokrąglania układu graficznego są niepoprawne przy wystarczająco wysokim DPI. Nowy algorytm generuje wyniki spełniające następujące kryteria:

    • Rzeczywista szerokość przypisana do *-kolumny nigdy nie jest mniejsza niż minimalna szerokość ani większa niż maksymalna szerokość.
    • Każda kolumna *, która nie ma przypisanej minimalnej lub maksymalnej szerokości, ma przypisaną szerokość proporcjonalną do jej *-wagi. Aby ściśle określić, jeśli dwie kolumny są zadeklarowane o szerokościach x* i y* odpowiednio, i jeśli żadna z kolumn nie osiąga swojej minimalnej lub maksymalnej szerokości, rzeczywiste szerokości v i w przypisane kolumnom pozostają w tej samej proporcji: v / w == x / y.
    • Całkowita szerokość przydzielona „proporcjonalnym” *-kolumnom jest równa przestrzeni dostępnej po przydzieleniu ograniczonym kolumnom (stałym, automatycznym i *-kolumnom, które mają przydzielane swoje minimalne lub maksymalne szerokości). Może to być zero, na przykład jeśli suma minimalnych szerokości przekracza dostępną szerokość siatki.
    • Wszystkie te oświadczenia mają być interpretowane w odniesieniu do układu "idealnego". Gdy zaokrąglanie układu jest stosowane, rzeczywiste szerokości mogą się różnić od idealnych szerokości nawet o jeden piksel.

Notatka

Wszystkie informacje zawarte w tym artykule na temat kolumn i szerokości odnoszą się również do wierszy i wysokości.

Sugestia

Domyślnie aplikacje przeznaczone dla wersji programu .NET Framework, począwszy od programu .NET Framework 4.7, będą widzieć nowy algorytm, podczas gdy aplikacje przeznaczone dla programu .NET Framework 4.6.2 lub starsze wersje będą widzieć stary algorytm.

Aby zastąpić wartość domyślną, użyj następującego ustawienia konfiguracji:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true" />
</runtime>

Wartość true wybiera stary algorytm, false wybiera nowy algorytm.

Nazwa Wartość
Zakres Małoletni
Wersja 4.7
Typ Retargeting (retargetowanie)

WPF Pointer-Based Touch Stack

Szczegóły

Ta zmiana dodaje możliwość włączenia opcjonalnego stosu WPF touch/stylus opartego na WM_POINTER. Deweloperzy, którzy nie włączają jawnie tej funkcji, nie powinni widzieć żadnych zmian w zachowaniu WPF touch/stylus. Bieżące znane problemy z opcjonalnym stosem touch/stylus opartym na WM_POINTER:

  • Brak obsługi pisma odręcznego w czasie rzeczywistym.
  • Chociaż funkcje rysowania i StylusPlugins będą nadal działać, będą przetwarzane w wątku interfejsu użytkownika, co może prowadzić do słabej wydajności.
  • Zmiany zachowania spowodowane zmianami obsługi ze zdarzeń dotykowych/rysika do zdarzeń myszy
  • Manipulacja może zachowywać się inaczej
  • Przeciąganie/upuszczanie nie wyświetli odpowiedniej informacji zwrotnej dotyczącej wprowadzania dotykowego
  • Nie ma to wpływu na dane wejściowe rysika
  • Przeciąganie/upuszczanie nie może być już inicjowane przy użyciu zdarzeń dotyku/rysika
  • Może to potencjalnie spowodować, że aplikacja przestanie odpowiadać do momentu wykrycia danych wejściowych myszy.
  • Zamiast tego, deweloperzy powinni inicjować przeciąganie i upuszczanie na podstawie zdarzeń myszy.

Sugestia

Programiści, którzy chcą włączyć ten stos, mogą dodać/scalić następujące elementy do pliku App.config aplikacji:

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Input.Stylus.EnablePointerSupport=true"/>
</runtime>
</configuration>

Usunięcie tego ustawienia lub ustawienie jego wartości na false wyłączy ten opcjonalny stos. Należy pamiętać, że ten stos jest dostępny tylko w Windows 10 Creators Update i nowszych wersjach.

Nazwa Wartość
Zakres Edge
Wersja 4.7
Typ Retargeting (retargetowanie)

Windows Workflow Foundation (WF)

Sumy kontrolne przepływu pracy zostały zmienione z MD5 na SHA1

Szczegóły

W celu wsparcia debugowania w programie Visual Studio, środowisko uruchomieniowe przepływu pracy generuje sumę kontrolną dla wystąpienia przepływu pracy, używając algorytmu mieszającego. W programie .NET Framework 4.6.2 i starszych wersjach skrót sumy kontrolnej przepływu pracy używał algorytmu MD5, co powodowało problemy w systemach obsługujących standard FIPS. Począwszy od programu .NET Framework 4.7, algorytm to SHA1. Jeśli kod utrwali te sumy kontrolne, będą one niezgodne.

Sugestia

Jeśli kod nie może załadować wystąpień przepływu pracy z powodu błędu sumy kontrolnej, spróbuj ustawić przełącznik AppContext "Switch.System.Activities.UseMD5ForWFDebugger" na 'true'. W kodzie:

System.AppContext.SetSwitch("Switch.System.Activities.UseMD5ForWFDebugger", true);

Lub w konfiguracji:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Activities.UseMD5ForWFDebugger=true" />
  </runtime>
</configuration>
Nazwa Wartość
Zakres Małoletni
Wersja 4.7
Typ Retargeting (remarketing)

.NET Framework 4.7.1

ASP.NET

ulepszenia ułatwień dostępu ASP.NET w programie .NET Framework 4.7.1

Szczegóły

Począwszy od platformy .NET Framework 4.7.1, ASP.NET ulepszył sposób, w jaki kontrolki sieci web ASP.NET współpracują z technologią ułatwień dostępu w programie Visual Studio, aby lepiej obsługiwać klientów ASP.NET. Obejmują one następujące zmiany:

  • Zmiany w implementacji brakujących wzorców dostępności interfejsu użytkownika w kontrolkach, takich jak okno dialogowe "Add Field" w kreatorze "Details View" czy okno dialogowe "Configure ListView" kreatora "ListView".
  • Zmiany mające na celu ulepszenie wyświetlania w trybie dużego kontrastu, np. Edytor pól Data Pager.
  • Zmiany mające na celu ulepszenie nawigacji za pomocą klawiatury w kontrolkach, takich jak okno dialogowe Pola w kreatorze Edytowania Pól Pageru, kontrolki DataPager, okno dialogowe Konfigurowania ObjectContext lub okno dialogowe Konfigurowania Wyboru Danych w kreatorze Konfigurowania Źródła Danych.

Sugestia

Jak wyrazić zgodę na te zmiany lub zrezygnować z nich Aby projektant programu Visual Studio korzystał z tych zmian, musi działać w programie .NET Framework 4.7.1 lub nowszym. Aplikacja internetowa może korzystać z tych zmian w jeden z następujących sposobów:

  • Zainstaluj program Visual Studio 2017 15.3 lub nowszy, który domyślnie obsługuje nowe funkcje ułatwień dostępu za pomocą następującego przełącznika AppContext.
  • Rezygnacja ze starszych zachowań ułatwień dostępu poprzez dodanie przełącznika Switch.UseLegacyAccessibilityFeatures AppContext do sekcji <runtime> w pliku devenv.exe.config i ustawienie go na false, jak pokazano w poniższym przykładzie.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
...
<!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false'  -->
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false" />
...
</runtime>
</configuration>

Aplikacje przeznaczone dla programu .NET Framework 4.7.1 lub nowszego i chcą zachować starsze zachowanie ułatwień dostępu, mogą wyrazić zgodę na korzystanie ze starszych funkcji ułatwień dostępu, jawnie ustawiając ten przełącznik AppContext na true.

Nazwa Wartość
Zakres Małoletni
Wersja 4.7.1
Typ Retargeting (ponowne kierowanie reklam)

Rdzeń

Wyjątki w tle dla wątku SerialPort

Szczegóły

Wątki w tle utworzone za pomocą strumieni SerialPort już nie przerywają procesu po wystąpieniu wyjątków systemu operacyjnego.
W aplikacjach przeznaczonych dla platformy .NET Framework 4.7 i starszych wersji proces jest przerywany, gdy w wątku w tle zostanie zgłoszony wyjątek systemu operacyjnego utworzony przy użyciu strumienia SerialPort.
W aplikacjach przeznaczonych dla programu .NET Framework 4.7.1 lub nowszej wersji wątki w tle czekają na zdarzenia systemu operacyjnego związane z aktywnym portem szeregowym i mogą ulec awarii w niektórych przypadkach, takich jak nagłe usunięcie portu szeregowego.

Sugestia

W przypadku aplikacji przeznaczonych dla programu .NET Framework 4.7.1 możesz zrezygnować z obsługi wyjątków, jeśli nie jest to pożądane, dodając następujące informacje do sekcji <runtime> pliku app.config:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.Ports.DoNotCatchSerialStreamThreadExceptions=true" />
</runtime>

W przypadku aplikacji przeznaczonych dla wcześniejszych wersji programu .NET Framework, ale uruchamianych w programie .NET Framework 4.7.1 lub nowszym, możesz wyrazić zgodę na obsługę wyjątków, dodając następujące informacje do sekcji <runtime> pliku app.config:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.Ports.DoNotCatchSerialStreamThreadExceptions=false" />
</runtime>
Nazwa Wartość
Zakres Małoletni
Wersja 4.7.1
Typ Retargeting

Interfejsy API, których dotyczy problem

Usługa ServiceBase nie propaguje wyjątków OnStart

Szczegóły

W programie .NET Framework 4.7 i starszych wersjach wyjątki zgłoszone podczas uruchamiania usługi nie są propagowane do obiektu wywołującego ServiceBase.Run.

Począwszy od aplikacji przeznaczonych dla programu .NET Framework 4.7.1, środowisko uruchomieniowe propaguje wyjątki do ServiceBase.Run dla usług, które nie mogą się uruchomić.

Sugestia

Po uruchomieniu usługi, jeśli wystąpi wyjątek, ten wyjątek zostanie rozpropagowany. Powinno to pomóc w diagnozowaniu przypadków, w których nie można uruchomić usług.

Jeśli to zachowanie jest niepożądane, możesz zrezygnować z niego, dodając następujący element AppContextSwitchOverrides do sekcji runtime pliku konfiguracji aplikacji:

<AppContextSwitchOverrides value="Switch.System.ServiceProcess.DontThrowExceptionsOnStart=true" />

Jeśli aplikacja jest przeznaczona dla starszej wersji niż 4.7.1, ale chcesz mieć to zachowanie, dodaj następujący element AppContextSwitchOverrides do sekcji runtime pliku konfiguracji aplikacji:

<AppContextSwitchOverrides value="Switch.System.ServiceProcess.DontThrowExceptionsOnStart=false" />
Nazwa Wartość
Zakres Małoletni
Wersja 4.7.1
Typ Retargeting (ponowne kierowanie reklam)

Interfejsy API, których dotyczy problem

Bezpieczeństwo

Domyślne algorytmy SignedXML i SignedXMS zmieniły się na SHA256

Szczegóły

W .NET Framework 4.7 i wcześniejszych, SignedXML i SignedCMS domyślnie używają SHA1 do niektórych operacji. Począwszy od .NET Framework 4.7.1, SHA256 jest domyślnie włączony dla tych operacji. Ta zmiana jest konieczna, ponieważ algorytm SHA1 nie jest już uważany za bezpieczny.

Sugestia

Istnieją dwie nowe wartości przełącznika kontekstu służące do kontrolowania, czy algorytm SHA1 (niezabezpieczony) lub SHA256 jest domyślnie używany:

  • Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms
  • Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms Dla aplikacji przeznaczonych dla platformy .NET Framework 4.7.1 i nowszych wersji, jeśli użycie algorytmu SHA256 jest niepożądane, możesz przywrócić ustawienie domyślne SHA1, dodając następujący przełącznik konfiguracji do sekcji czasu wykonywania pliku konfiguracyjnego aplikacji:
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms=true;Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms=true" />

W przypadku aplikacji przeznaczonych dla platformy .NET Framework 4.7 i starszych wersji można wyrazić zgodę na tę zmianę, dodając następujący przełącznik konfiguracji do sekcji środowiska uruchomieniowego pliku konfiguracji aplikacji:

<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms=false;Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms=false" />
Nazwa Wartość
Zakres Małoletni
Wersja 4.7.1
Typ Retargeting (ponowne targetowanie)

Interfejsy API, których dotyczy problem

SignedXml.GetPublicKey zwraca RSACng na net462 (lub lightup) bez zmiany retargetingu

Szczegóły

Począwszy od wersji 4.6.2 .NET Framework, konkretny typ obiektu zwracanego przez metodę SignedXml.GetPublicKey został zmieniony (bez szczególnych zmian) z implementacji CryptoServiceProvider na implementację Cng. Wynika to z faktu, że implementacja zmieniła się z używania certificate.PublicKey.Key na używanie wewnętrznego certificate.GetAnyPublicKey, który przekierowuje do RSACertificateExtensions.GetRSAPublicKey.

Sugestia

Począwszy od aplikacji działających 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 Wartość
Zakres Edge
Wersja 4.6.2
Typ Retargeting

Interfejsy API, których dotyczy problem

Windows Communication Foundation (WCF)

Ulepszone ułatwienia dostępu dla niektórych narzędzi zestawu SDK platformy .NET

Szczegóły

W zestawie .NET Framework SDK 4.7.1 narzędzia SvcConfigEditor.exe i SvcTraceViewer.exe zostały ulepszone poprzez rozwiązanie różnych problemów z ułatwieniami dostępu. Większość z nich to małe problemy, takie jak nazwa, która nie jest zdefiniowana, lub niektóre wzorce automatyzacji interfejsu użytkownika nie są prawidłowo implementowane. Chociaż wielu użytkowników nie wiedziało o tych nieprawidłowych wartościach, klienci korzystający z technologii pomocniczych, takich jak czytniki zawartości ekranu, znajdą te narzędzia zestawu SDK bardziej dostępne. Z pewnością te poprawki zmieniają niektóre poprzednie zachowania, takie jak kolejność ustawienia fokusu klawiatury. Aby uzyskać wszystkie poprawki ułatwień dostępu w tych narzędziach, możesz dodać następujące do pliku app.config:

<runtime>
  <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false"/>
</runtime>
Nazwa Wartość
Zakres Edge
Wersja 4.7.1
Typ Retargeting

Formularze systemu Windows

Ulepszenia ułatwień dostępu w kontrolkach formularzy systemu Windows

Szczegóły

Windows Forms ulepsza sposób pracy z technologiami ułatwień dostępu, aby lepiej obsługiwać klientów windows Forms. Obejmują one następujące zmiany, począwszy od programu .NET Framework 4.7.1:

  • Zmiany w celu ulepszenia wyświetlania w trybie dużego kontrastu.
  • Zmiany w celu ulepszenia środowiska przeglądarki właściwości. Ulepszenia przeglądarki właściwości obejmują:
  • Lepsza nawigacja za pomocą klawiatury w rozwijanych oknach wyboru.
  • Zmniejszona ilość niepotrzebnych zatrzymań kart.
  • Lepsze raportowanie typów kontroli.
  • Ulepszone zachowanie narratora.
  • Zmiany mające na celu wdrożenie brakujących wzorców ułatwień dostępu w interfejsie użytkownika dla kontrolek.

Sugestia

Jak wyrazić zgodę na te zmiany lub zrezygnować z nich Aby aplikacja mogła korzystać z tych zmian, musi działać w programie .NET Framework 4.7.1 lub nowszym. Aplikacja może korzystać z tych zmian w jeden z następujących sposobów:

  • Jest on ponownie kompilowany, aby działać w ramach .NET Framework 4.7.1. Te zmiany ułatwień dostępu są domyślnie włączone w aplikacjach Windows Forms przeznaczonych dla programu .NET Framework 4.7.1 lub nowszego.
  • Zrezygnowanie ze starszych zachowań ułatwień dostępu przez dodanie następującego przełącznika AppContext do sekcji <runtime> pliku app.config i ustawienie go na false, co zilustrowano w poniższym przykładzie.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
  </startup>
  <runtime>
    <!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false  -->
    <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false" />
  </runtime>
</configuration>

Aplikacje przeznaczone dla programu .NET Framework 4.7.1 lub nowszego i chcą zachować starsze zachowanie ułatwień dostępu, mogą wyrazić zgodę na korzystanie ze starszych funkcji ułatwień dostępu, jawnie ustawiając ten przełącznik AppContext na true.

Aby zapoznać się z omówieniem automatyzacji interfejsu użytkownika, zobacz omówienie automatyzacji interfejsu użytkownika .

Dodano obsługę wzorców i właściwości automatyzacji interfejsu użytkownika

Klienci ułatwień dostępu mogą korzystać z nowych funkcji ułatwień dostępu WinForms przy użyciu typowych, publicznie opisanych wzorców wywołań. Te wzorce nie są specyficzne dla formularzy WinForms. Na przykład klienci ułatwień dostępu mogą wywoływać metodę QueryInterface w interfejsie IAccessible (MAAS), aby uzyskać interfejs IServiceProvider. Jeśli ten interfejs jest dostępny, klienci mogą żądać interfejsu IAccessibleEx za pomocą metody QueryService. Aby uzyskać więcej informacji, zobacz Korzystanie z IAccessibleEx przez klienta. Począwszy od programu .NET Framework 4.7.1, IServiceProvider i IAccessibleEx (jeśli ma to zastosowanie) są dostępne dla obiektów ułatwień dostępu WinForms.

Program .NET Framework 4.7.1 dodaje obsługę następujących wzorców i właściwości automatyzacji interfejsu użytkownika:

używanie kolorów zdefiniowanych przez system operacyjny w motywach o wysokim kontraście

  • Kontrolki Button i CheckBox, których właściwość FlatStyle jest ustawiona na FlatStyle.Systembędący stylem domyślnym, teraz po wybraniu używają kolorów zdefiniowanych przez system operacyjny w motywie Wysoki Kontrast. Wcześniej kolory tekstu i tła nie były kontrastujące i były trudne do odczytania.
  • Kontrolki Button, CheckBox, RadioButton, Label, LinkLabeli GroupBox z właściwością Enabled ustawioną na false wykorzystały cieniowany kolor do renderowania tekstu w motywach o wysokim kontraście, co skutkowało niskim kontrastem tekstu względem tła. Teraz te kontrolki używają koloru "Wyłączony tekst" zdefiniowanego przez system operacyjny. Ta poprawka dotyczy kontrolek z właściwością FlatStyle ustawioną na wartość inną niż FlatStyle.System. Te ostatnie kontrolki są renderowane przez system operacyjny.
  • DataGridView teraz renderuje widoczny prostokąt wokół zawartości komórki, która ma bieżący fokus. Wcześniej nie było to widoczne w niektórych motywach wysokiego kontrastu.
  • ToolStripMenuItem kontrolki z właściwością Enabled ustawioną na false teraz używają koloru "Wyłączony Tekst" zdefiniowanego przez system operacyjny.
  • ToolStripMenuItem kontrolki z ich właściwością Checked ustawioną na wartość true teraz renderują skojarzony znacznik wyboru w kontrastowym kolorze systemowym. Wcześniej kolor znacznika wyboru nie był wystarczająco kontrastujący i nie był widoczny w motywach o wysokim kontraście. UWAGA: System Windows 10 zmienił wartości dla niektórych kolorów systemowych o wysokim kontraście. Struktura Windows Forms Framework jest oparta na strukturze Win32. Aby uzyskać najlepsze wrażenia, uruchom na najnowszej wersji systemu Windows i wyraź zgodę na najnowsze zmiany systemu operacyjnego, dodając plik app.manifest w aplikacji testowej i odkomentowując poniższy kod:
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

ulepszona nawigacja za pomocą klawiatury

  • Gdy kontrolka ComboBox ma właściwość DropDownStyle ustawioną na ComboBoxStyle.DropDownList i jest pierwszą kontrolką w kolejności tabulacji w formularzu, teraz wyświetla prostokąt fokusu po otwarciu formularza nadrzędnego za pomocą klawiatury. Przed tą zmianą fokus klawiatury był na tej kontrolce, ale wskaźnik koncentracji uwagi nie został renderowany.

ulepszona obsługa narratora

  • Kontrola MonthCalendar dodała obsługę technologii pomocniczych, umożliwiając odczyt kontrolki, w tym odczytywanie wartości kontrolki przez Narratora, który wcześniej tego nie mógł.

  • Kontrolka CheckedListBox powiadamia teraz Narratora o zmianie właściwości CheckBox.CheckState. Wcześniej Narrator nie otrzymał powiadomienia i w rezultacie użytkownicy nie zostali poinformowani, że właściwość CheckState została zaktualizowana.

  • Kontrolka LinkLabel zmieniła sposób powiadamiania Narratora o tekście znajdującym się w kontrolce. Wcześniej Narrator zapowiedział ten tekst dwukrotnie i przeczytał symbole "&" jako prawdziwy tekst, mimo że nie są widoczne dla użytkownika. Z ogłoszeń Narratora usunięto zduplikowany tekst oraz niepotrzebne symbole "&".

  • Typy kontrolek DataGridViewCell teraz prawidłowo zgłaszają stan tylko do odczytu narratorowi i innym technologiom pomocniczym.

  • Narrator jest teraz w stanie odczytać menu systemowe okien podrzędnych w aplikacjach [Multiple-Document Interface]~/docs/framework/winforms/advanced/multiple-document-interface-mdi-applications.md.

  • Narrator może teraz odczytywać kontrolki ToolStripMenuItem z właściwością ToolStripItem.Enabled ustawioną na wartość false. Wcześniej Narrator nie mógł skoncentrować się na wyłączonych elementach menu w celu odczytania zawartości.

Nazwa Wartość
Zakres Główny
Wersja 4.8
Typ Retargeting

Interfejsy API, których dotyczy problem

Windows Presentation Foundation (WPF)

Ulepszenia ułatwień dostępu w WPF

Szczegóły

Ulepszenia wysokiego kontrastu

  • Fokus kontrolki Expander jest teraz widoczny. W poprzednich wersjach .NET Framework to nie istniało.
  • Tekst w kontrolkach CheckBox i RadioButton po ich wybraniu jest teraz łatwiejszy do wyświetlenia niż w poprzednich wersjach programu .NET Framework.
  • Obramowanie wyłączonego ComboBox jest teraz tym samym kolorem co wyłączony tekst. W poprzednich wersjach programu .NET Framework nie było to.
  • Wyłączone i ukierunkowane przyciski używają teraz poprawnego koloru motywu. W poprzednich wersjach platformy .NET Framework tego nie było.
  • Przycisk listy rozwijanej jest teraz widoczny, gdy styl kontrolki ComboBox jest ustawiony na ToolBar.ComboBoxStyleKey. W poprzednich wersjach programu .NET Framework to nie było.
  • Strzałka wskaźnika sortowania w kontrolce DataGrid teraz używa kolorów motywu. W poprzednich wersjach .NET Framework tego nie było.
  • Domyślny styl hiperłącza teraz zmienia się na prawidłowy kolor motywu po najechaniu kursorem. W poprzednich wersjach programu .NET Framework nie działało.
  • Fokus klawiatury na przyciskach radiowych jest teraz widoczny. W poprzednich wersjach programu .NET Framework tego nie było.
  • Kolumna z polami wyboru kontrolki DataGrid teraz używa oczekiwanych kolorów dla wskaźnika fokusu klawiatury. W poprzednich wersjach programu .NET Framework tego nie było.
  • Wizualizacje fokusu klawiatury są teraz widoczne na kontrolkach ComboBox i ListBox. We wcześniejszych wersjach programu .NET Framework nie było dostępne.

Ulepszenia interakcji czytnika ekranu

  • Expander elementy sterujące są teraz poprawnie ogłaszane jako grupy (rozwijanie/zwijanie) przez czytniki ekranowe.
  • kontrolki DataGridCell są teraz poprawnie ogłaszane jako komórka siatki danych (zlokalizowane) przez czytniki zawartości ekranu.
  • Czytniki ekranu będą teraz odczytywać nazwę edytowalnego ComboBox.
  • PasswordBox kontrolki nie są już ogłaszane jako "żaden element do wyświetlenia" przez czytniki ekranu.

obsługa LiveRegion

Czytniki zawartości ekranu, takie jak Narrator, ułatwiają użytkownikom zrozumienie interfejsu użytkownika aplikacji, zwykle przez opisywanie elementu interfejsu użytkownika, który ma obecnie fokus. Jeśli jednak element interfejsu użytkownika zmieni się gdzieś na ekranie i nie ma fokusu, użytkownik może nie być poinformowany i przegapić ważne informacje. LiveRegions mają rozwiązać ten problem. Deweloper może ich używać do informowania czytnika zawartości ekranu lub innych automatyzacji interfejsu użytkownika klienta, że wprowadzono ważną zmianę w elemecie interfejsu użytkownika. Czytnik zawartości ekranu może następnie zdecydować, jak i kiedy poinformować użytkownika o tej zmianie. Właściwość LiveSetting umożliwia również czytnikowi zawartości ekranu określenie, jak ważne jest informowanie użytkownika o zmianie wprowadzonej w interfejsie użytkownika.

Sugestia

Jak wyrazić zgodę na te zmiany lub zrezygnować z nich

Aby aplikacja korzystała z tych zmian, musi działać w programie .NET Framework 4.7.1 lub nowszym. Aplikacja może korzystać z tych zmian w jeden z następujących sposobów:

  • Ustaw docelową wersję .NET Framework 4.7.1. Jest to zalecane podejście. Te zmiany ułatwień dostępu są domyślnie włączone w aplikacjach WPF przeznaczonych dla programu .NET Framework 4.7.1 lub nowszego.

  • Rezygnacja z starszych zachowań ułatwień dostępu przez dodanie następującego przełącznika AppContext w sekcji <runtime> pliku konfiguracji aplikacji i ustawienie go na false, jak pokazano w poniższym przykładzie.

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
      </startup>
      <runtime>
        <!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false'  -->
        <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false" />
      </runtime>
    </configuration>
    

Aplikacje przeznaczone dla programu .NET Framework 4.7.1 lub nowszego i chcą zachować starsze zachowanie ułatwień dostępu, mogą wyrazić zgodę na korzystanie ze starszych funkcji ułatwień dostępu przez jawne ustawienie tego przełącznika AppContext na true. Aby zapoznać się z omówieniem automatyzacji interfejsu użytkownika, zobacz Omówienie automatyzacji interfejsu użytkownika.

Nazwa Wartość
Zakres Major
Wersja 4.7.1
Typ Remarketing

Interfejsy API, których dotyczy problem

Zdarzenie Selector SelectionChanged i właściwość SelectedValue

Szczegóły

Począwszy od programu .NET Framework 4.7.1, Selector zawsze aktualizuje wartość jej właściwości SelectedValue przed podniesieniem zdarzenia SelectionChanged, gdy jego wybór ulegnie zmianie. Dzięki temu właściwość SelectedValue jest zgodna z innymi właściwościami wyboru (SelectedItem i SelectedIndex), które są aktualizowane przed wywołaniem zdarzenia.

W programie .NET Framework 4.7 i starszych wersjach aktualizacja selectedValue miała miejsce przed zdarzeniem w większości przypadków, ale wystąpiła po wystąpieniu zdarzenia, jeśli zmiana wyboru została spowodowana przez zmianę właściwości SelectedValue.

Sugestia

Aplikacje przeznaczone dla programu .NET Framework 4.7.1 lub nowszego mogą zrezygnować z tej zmiany i korzystać ze starszego zachowania, dodając następujące informacje do sekcji <runtime> pliku konfiguracji aplikacji:

<runtime>
<AppContextSwitchOverrides
value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=true" />
</runtime>

Aplikacje przeznaczone dla programu .NET Framework 4.7 lub starszego, ale działają w programie .NET Framework 4.7.1 lub nowszym, mogą włączyć nowe zachowanie, dodając następujący wiersz do sekcji <runtime> pliku konfiguracji aplikacji:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=false" />
</runtime>
Nazwa Wartość
Zakres Małoletni
Wersja 4.7.1
Typ Retargeting

Interfejsy API, których dotyczy problem

Zdarzenie TabControl SelectionChanged i właściwość SelectedContent

Szczegóły

Począwszy od programu .NET Framework 4.7.1, TabControl aktualizuje wartość swojej właściwości SelectedContent przed wywołaniem zdarzenia SelectionChanged, gdy wybór zostanie zmieniony. W programie .NET Framework 4.7 i starszych wersjach aktualizacja właściwości SelectedContent miała miejsce po zdarzeniu.

Sugestia

Aplikacje przeznaczone dla programu .NET Framework 4.7.1 lub nowszego mogą zrezygnować z tej zmiany i korzystać ze starszego zachowania, dodając następujące informacje do sekcji <runtime> pliku konfiguracji aplikacji:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=true" />
</runtime>

Aplikacje przeznaczone dla programu .NET Framework 4.7 lub starszego, ale działają w programie .NET Framework 4.7.1 lub nowszym, mogą włączyć nowe zachowanie, dodając następujący wiersz do sekcji <runtime> pliku konfiguracji aplikacji:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=false" />
</runtime>
Nazwa Wartość
Zakres Małoletni
Wersja 4.7.1
Typ Retargetowanie

Interfejsy API, których dotyczy problem

Domyślny algorytm wyznaczania wartości skrótu dla elementu WPF PackageDigitalSignatureManager to teraz SHA256

Szczegóły

System.IO.Packaging.PackageDigitalSignatureManager zapewnia funkcje podpisów cyfrowych w odniesieniu do pakietów WPF. W programie .NET Framework 4.7 i starszych wersjach domyślny algorytm (PackageDigitalSignatureManager.DefaultHashAlgorithm) używany do podpisywania części pakietu to SHA1. Ze względu na ostatnie obawy dotyczące zabezpieczeń sha1 ta wartość domyślna została zmieniona na SHA256, począwszy od programu .NET Framework 4.7.1. Ta zmiana ma wpływ na wszystkie podpisywanie pakietów, w tym dokumenty XPS.

Sugestia

Deweloper, który chce wykorzystać tę zmianę, jeśli docelowa wersja platformy jest poniżej .NET Framework 4.7.1, lub deweloper, który potrzebuje wcześniejszej funkcjonalności przy wersji .NET Framework 4.7.1 lub nowszej, może odpowiednio ustawić następującą flagę AppContext. Wartość true spowoduje, że algorytm SHA1 będzie używany jako algorytm domyślny; wartość false powoduje użycie SHA256.

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.MS.Internal.UseSha1AsDefaultHashAlgorithmForDigitalSignatures=true"/>
</runtime>
</configuration>
Nazwa Wartość
Zakres Edge
Wersja 4.7.1
Typ Ponowne dotarcie (retargeting)

Interfejsy API, których dotyczy problem

Windows Workflow Foundation (WF)

Ulepszenia ułatwień dostępu w projektancie przepływu pracy programu Windows Workflow Foundation (WF)

Szczegóły

Projektant przepływu pracy programu Windows Workflow Foundation (WF) ulepsza sposób działania z technologiami ułatwień dostępu. Te ulepszenia obejmują następujące zmiany:

  • Kolejność tabulacji została zmieniona na lewą do prawej i od góry do dołu w niektórych kontrolkach:
  • Okno inicjowania korelacji do ustawiania danych korelacji dla działania InitializeCorrelation
  • Okno definicji zawartości dla działań Receive, Send, SendReplyi ReceiveReply
  • Więcej funkcji jest dostępnych za pomocą klawiatury:
  • Podczas edytowania właściwości działania grupy właściwości można zwinąć za pomocą klawiatury przy pierwszym skupieniu na nich.
  • Ikony ostrzeżeń są teraz dostępne za pomocą klawiatury.
  • Przycisk Więcej właściwości w oknie Właściwości jest teraz dostępny za pomocą klawiatury.
  • Użytkownicy klawiatury mogą teraz uzyskiwać dostęp do elementów nagłówka w okienkach Argumenty i zmienne projektanta przepływu pracy.
  • Ulepszona widoczność elementów z fokusem, na przykład w następujących przypadkach:
  • Dodawanie wierszy do siatek danych używanych przez projektanta przepływu pracy i projektantów działań.
  • Przechodzenie między polami w aktywnościach ReceiveReply i SendReply.
  • Ustawianie wartości domyślnych zmiennych lub argumentów
  • Czytniki zawartości ekranu mogą teraz poprawnie rozpoznać:
  • Punkty przerwania ustawione w projektancie przepływu pracy.
  • Działania FlowSwitch<T>, FlowDecisioni CorrelationScope.
  • Zawartość aktywności Receive.
  • Typ docelowy działania InvokeMethod.
  • Pole kombi Wyjątki i sekcja Finally w działaniu TryCatch.
  • Pole kombi Typ wiadomości, rozdzielacz w oknie Dodaj Inicjatory Korelacji, okno Definicji Zawartości i okno Definicji Korelacji w działaniach obsługi komunikatów (Receive, Send, SendReplyi ReceiveReply).
  • Przejścia maszyny stanowej i cele przejść.
  • Adnotacje i łączniki dotyczące działań FlowDecision.
  • Menu kontekstowe (kliknij prawym przyciskiem myszy) dla działań.
  • Edytory wartości właściwości, przycisk Wyczyść wyszukiwanie, przyciski Według kategorii i sortowania alfabetycznego oraz okno dialogowe Edytor wyrażeń w siatce właściwości.
  • Procent powiększenia w Projektancie przepływu pracy.
  • Separator w działaniach Parallel i Pick.
  • Działanie InvokeDelegate.
  • Okno wyboru typów dla działań słownika (Microsoft.Activities.AddToDictionary<TKey,TValue>, Microsoft.Activities.RemoveFromDictionary<TKey,TValue>, itp.).
  • Okno Przeglądaj i Wybierz typ platformy .NET.
  • Nawigacja ścieżkowa w projektancie przepływu pracy.
  • Użytkownicy, którzy wybierają motywy o wysokim kontraście, zobaczą wiele ulepszeń widoczności projektanta przepływu pracy i jego kontrolek, takich jak lepsze współczynniki kontrastu między elementami i bardziej zauważalne pola wyboru używane do elementów koncentracji uwagi.

Sugestia

Jeśli masz aplikację z ponownie hostowanym projektantem przepływu pracy, aplikacja może skorzystać z tych zmian, wykonując jedną z następujących akcji:

  • Przekompiluj swoją aplikację, aby była zgodna z .NET Framework 4.7.1. Te zmiany ułatwień dostępu są domyślnie włączone.
  • Jeśli aplikacja jest przeznaczona dla programu .NET Framework 4.7 lub starszego, ale jest uruchomiona w programie .NET Framework 4.7.1, możesz zrezygnować z tych starszych zachowań ułatwień dostępu, dodając następujący przełącznik AppContext do sekcji <runtime> pliku app.config i ustawić ją na false, jak pokazano w poniższym przykładzie.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
  </startup>
  <runtime>
    <!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false  -->
    <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false" />
  </runtime>
</configuration>

Aplikacje przeznaczone dla programu .NET Framework 4.7.1 lub nowszego i chcą zachować starsze zachowanie ułatwień dostępu, mogą wyrazić zgodę na korzystanie ze starszych funkcji ułatwień dostępu, jawnie ustawiając ten przełącznik AppContext na true.

Nazwa Wartość
Zakres Małoletni
Wersja 4.7.1
Typ Retargeting

.NET Framework 4.7.2

Rdzeń

Zezwalaj na dwukierunkowe znaki kontrolek Unicode w identyfikatorach URI

Szczegóły

Unicode określa kilka specjalnych znaków sterujących używanych do określania orientacji tekstu. W poprzednich wersjach programu .NET Framework znaki te zostały niepoprawnie usunięte ze wszystkich identyfikatorów URI, nawet jeśli były obecne w postaci zakodowanej procentowo. Aby lepiej śledzić RFC 3987, teraz zezwalamy na te znaki w identyfikatorach URI. Po znalezieniu niekodowanego w identyfikatorze URI są one kodowane procentowo. Kiedy są znalezione jako zakodowane w formacie procentowym, zostają pozostawione as-is.

Sugestia

W przypadku aplikacji przeznaczonych dla wersji programu .NET Framework, począwszy od wersji 4.7.2, obsługa znaków dwukierunkowych Unicode jest domyślnie włączona. Jeśli ta zmiana jest niepożądana, możesz ją wyłączyć, dodając następujący przełącznik AppContextSwitchOverrides do sekcji <runtime> pliku konfiguracji aplikacji:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Uri.DontKeepUnicodeBidiFormattingCharacters=true" />
</runtime>

W przypadku aplikacji przeznaczonych dla wcześniejszych wersji programu .NET Framework, ale są uruchomione w wersjach, począwszy od programu .NET Framework 4.7.2, obsługa znaków dwukierunkowych Unicode jest domyślnie wyłączona. Można ją włączyć, dodając następujący przełącznik AppContextSwitchOverrides do sekcji <runtime> pliku konfiguracji aplikacji:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Uri.DontKeepUnicodeBidiFormattingCharacters=false" />
</runtime>
Nazwa Wartość
Zakres Małoletni
Wersja 4.7.2
Typ Retargeting (ponowne targetowanie)

Interfejsy API, których dotyczy problem

Interfejs DeflateStream używa natywnych API do dekompresji

Szczegóły

Począwszy od programu .NET Framework 4.7.2, implementacja dekompresji w klasie T:System.IO.Compression.DeflateStream została zmieniona, aby domyślnie używać natywnych interfejsów API systemu Windows. Zazwyczaj powoduje to znaczną poprawę wydajności. Wszystkie aplikacje platformy .NET przeznaczone dla platformy .NET Framework w wersji 4.7.2 lub nowszej używają implementacji natywnej. Ta zmiana może spowodować pewne różnice w zachowaniu, które obejmują:

  • Komunikaty o wyjątkach mogą być inne. Jednak zgłaszany typ wyjątku pozostaje taki sam.
  • Niektóre specjalne sytuacje, takie jak brak wystarczającej ilości pamięci do ukończenia operacji, mogą być obsługiwane inaczej.
  • Istnieją znane różnice w analizowaniu nagłówka gzip (uwaga: dotyczy to tylko GZipStream ustawionego do dekompresji):
  • Wyjątki podczas analizowania nieprawidłowych nagłówków mogą być zgłaszane w różnym czasie.
  • Implementacja natywna wymusza, że wartości niektórych flag zarezerwowanych wewnątrz nagłówka gzip (tj. FLG) są ustawione zgodnie ze specyfikacją, co może spowodować zgłoszenie wyjątku, w którym wcześniej nieprawidłowe wartości zostały zignorowane.

Sugestia

Jeśli dekompresja z natywnymi interfejsami API ma negatywny wpływ na zachowanie aplikacji, możesz zrezygnować z tej funkcji, dodając przełącznik Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression do sekcji runtime pliku app.config i ustawiając ją na true:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression=true" />
  </runtime>
</configuration>
Nazwa Wartość
Zakres Małoletni
Wersja 4.7.2
Typ Retargeting (ponowne kierowanie)

Interfejsy API, których dotyczy problem

Upewnij się, że System.Uri używa spójnego zestawu znaków zarezerwowanych

Szczegóły

W System.Uriniektóre znaki kodowane procentowo, które czasami były dekodowane, są teraz konsekwentnie pozostawiane w formie zakodowanej. Dzieje się to we właściwościach i metodach, które uzyskują dostęp do ścieżki, zapytania, fragmentu lub informacji o użytkowniku w identyfikatorze URI. Zachowanie zmieni się tylko wtedy, gdy obie z następujących wartości są spełnione:

  • Identyfikator URI zawiera zakodowaną formę dowolnego z następujących zastrzeżonych znaków: :, ', (, ), ! lub *.
  • Identyfikator URI zawiera znak Unicode lub zakodowany znak nierezerwowany. Jeśli oba powyższe warunki są spełnione, zakodowane znaki zastrzeżone pozostają zakodowane. W poprzednich wersjach programu .NET Framework są one dekodowane.

Sugestia

W przypadku aplikacji przeznaczonych dla wersji programu .NET Framework, począwszy od wersji 4.7.2, nowe zachowanie dekodowania jest domyślnie włączone. Jeśli ta zmiana jest niepożądana, możesz ją wyłączyć, dodając następujący przełącznik AppContextSwitchOverrides do sekcji <runtime> pliku konfiguracji aplikacji:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Uri.DontEnableStrictRFC3986ReservedCharacterSets=true" />
</runtime>

W przypadku aplikacji przeznaczonych dla wcześniejszych wersji programu .NET Framework, ale są uruchomione w wersjach, począwszy od programu .NET Framework 4.7.2, nowe zachowanie dekodowania jest domyślnie wyłączone. Można to włączyć, dodając następujący przełącznik AppContextSwitchOverrides do sekcji <runtime> pliku konfiguracji aplikacji:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Uri.DontEnableStrictRFC3986ReservedCharacterSets=false" />
</runtime>
Nazwa Wartość
Zakres Małoletni
Wersja 4.7.2
Typ Retargetowanie

Interfejsy API, których dotyczy problem

Program Resgen odmawia ładowania zawartości z internetu

Szczegóły

Pliki resx mogą zawierać dane wejściowe sformatowane binarnie. Jeśli próbujesz użyć rozszerzenia resgen do załadowania pliku pobranego z niezaufanej lokalizacji, ładowanie danych wejściowych domyślnie zakończy się niepowodzeniem.

Sugestia

Użytkownicy resgen, którzy wymagają ładowania danych binarnych z niezaufanych lokalizacji, mogą usunąć znacznik z sieci z pliku wejściowego lub zastosować opcję rezygnacji. Dodaj następujące ustawienie rejestru, aby zastosować mechanizm rezygnacji na poziomie całej maszyny: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\SDK] "AllowProcessOfUntrustedResourceFiles"="true"

Nazwa Wartość
Zakres Edge
Wersja 4.7.2
Typ Retargetowanie

Ślady stosu uzyskane podczas korzystania z przenośnych plików PDB zawierają teraz informacje o pliku źródłowym i wierszu, jeśli jest to wymagane

Szczegóły

Począwszy od programu .NET Framework 4.7.2, ślady stosu uzyskane podczas korzystania z przenośnych plików PDB zawierają informacje o pliku źródłowym i wierszu na żądanie. W wersjach wcześniejszych niż .NET Framework 4.7.2 informacje o pliku źródłowym i wierszu byłyby niedostępne w przypadku korzystania z przenośnych plików PDB, nawet jeśli jawnie zażądano.

Sugestia

W przypadku aplikacji przeznaczonych dla programu .NET Framework 4.7.2 możesz zrezygnować z pliku źródłowego i informacji o wierszu podczas korzystania z przenośnych plików PDB, jeśli nie jest to pożądane, dodając następujące informacje do sekcji <runtime> pliku app.config:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Diagnostics.IgnorePortablePDBsInStackTraces=true" />
</runtime>

W przypadku aplikacji przeznaczonych dla starszych wersji programu .NET Framework, ale uruchamianych w programie .NET Framework 4.7.2 lub nowszym, możesz wyrazić zgodę na informacje o pliku źródłowym i wierszu podczas korzystania z przenośnych plików PDB, dodając następujące informacje do sekcji <runtime> pliku app.config:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Diagnostics.IgnorePortablePDBsInStackTraces=false" />
</runtime>
Nazwa Wartość
Zakres Edge
Wersja 4.7.2
Typ Retargeting (celowanie ponowne)

Interfejsy API, których dotyczy problem

Formularze systemu Windows

Ulepszenia ułatwień dostępu w kontrolkach formularzy systemu Windows dla platformy .NET 4.7.2

Szczegóły

Platforma Windows Forms Framework ulepsza sposób pracy z technologiami ułatwień dostępu, aby lepiej obsługiwać klientów systemu Windows Forms. Obejmują one następujące zmiany:

  • Zmiany w celu ulepszenia wyświetlania w trybie dużego kontrastu.
  • Zmiany w celu ulepszenia nawigacji za pomocą klawiatury w kontrolkach DataGridView i MenuStrip.
  • Zmiany interakcji z Narratorem.

Sugestia

Jak zrezygnować z tych zmian W celu skorzystania z tych zmian aplikacja musi działać w programie .NET Framework 4.7.2 lub nowszym. Aplikacja może korzystać z tych zmian w jeden z następujących sposobów:

  • Został ponownie kompilowany do wersji docelowej .NET Framework 4.7.2. Te zmiany ułatwień dostępu są domyślnie włączone w aplikacjach Windows Forms przeznaczonych dla programu .NET Framework 4.7.2 lub nowszego.
  • Jest ona przeznaczona dla programu .NET Framework 4.7.1 lub starszej wersji i rezygnuje z dziedziczonych zachowań ułatwień dostępu przez dodanie następującego przełącznika AppContext do sekcji <runtime> pliku konfiguracji aplikacji i ustawienie tego na false, jak pokazano w poniższym przykładzie.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
  </startup>
  <runtime>
    <!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false  -->
    <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false" />
  </runtime>
</configuration>

Należy pamiętać, że aby wyrazić zgodę na funkcje ułatwień dostępu dodane w programie .NET Framework 4.7.2, należy również wyrazić zgodę na funkcje ułatwień dostępu programu .NET Framework 4.7.1. Aplikacje przeznaczone dla programu .NET Framework 4.7.2 lub nowszego i chcą zachować starsze zachowanie ułatwień dostępu, mogą wyrazić zgodę na korzystanie ze starszych funkcji ułatwień dostępu, jawnie ustawiając ten przełącznik AppContext na true.

używanie kolorów zdefiniowanych przez system operacyjny w motywach o wysokim kontraście

  • Strzałka listy rozwijanej ToolStripDropDownButton teraz używa kolorów zdefiniowanych przez system operacyjny w motywie o wysokim kontraście.
  • Button, kontrolki RadioButton i CheckBox z FlatStyle ustawione na FlatStyle.Flat lub FlatStyle.Popup teraz używają kolorów zdefiniowanych przez system operacyjny w motywie wysokiego kontrastu, gdy są zaznaczone. Wcześniej kolory tekstu i tła nie były kontrastujące i były trudne do odczytania.
  • Kontrolki zawarte w GroupBox, które mają właściwość Enabled ustawioną na false, będą teraz używać kolorów zdefiniowanych przez system operacyjny w trybie wysokiego kontrastu.
  • Kontrolki ToolStripButton, ToolStripComboBoxi ToolStripDropDownButton mają zwiększony współczynnik kontrastu jasności w Trybie Wysokiego Kontrastu.
  • DataGridViewLinkCell domyślnie używa kolorów zdefiniowanych przez system operacyjny w trybie dużego kontrastu dla właściwości DataGridViewLinkCell.LinkColor. UWAGA: System Windows 10 zmienił wartości dla niektórych kolorów systemowych o wysokim kontraście. Struktura Windows Forms Framework jest oparta na strukturze Win32. Aby uzyskać najlepsze doświadczenie, uruchom najnowszą wersję systemu Windows i włącz najnowsze zmiany systemu operacyjnego, dodając plik app.manifest w aplikacji testowej i odkomentowując następujący kod:
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

ulepszona obsługa narratora

  • Narrator teraz informuje o wartości właściwości ToolStripMenuItem.ShortcutKeys podczas prezentowania tekstu obiektu ToolStripMenuItem.
  • Narrator wskazuje teraz, kiedy ToolStripMenuItem ma właściwość Enabled ustawioną na false.
  • Narrator teraz przekazuje informację zwrotną na temat stanu pola wyboru, gdy właściwość ListView.CheckBoxes jest ustawiona na true.
  • Kolejność ustawienia fokusu trybu skanowania Narratora jest teraz zgodna z kolejnością wizualną kontrolek w oknie dialogowym pobierania ClickOnce.

Ulepszona obsługa ułatwień dostępu dla DataGridView

ulepszone wskazówki wizualne

  • Kontrolki RadioButton i CheckBox z pustą właściwością Text będą teraz wyświetlać wskaźnik fokusu, gdy otrzymają fokus.

ulepszona obsługa siatki właściwości

  • Elementy podrzędne kontrolki PropertyGrid teraz zwracają true dla właściwości IsReadOnlyProperty tylko wtedy, gdy element PropertyGrid jest włączony.

  • Elementy podrzędne kontrolki PropertyGrid teraz zwracają false dla właściwości IsEnabledProperty tylko wtedy, gdy element PropertyGrid może zostać zmieniony przez użytkownika. Aby zapoznać się z omówieniem automatyzacji interfejsu użytkownika, zobacz omówienie automatyzacji interfejsu użytkownika .

    ulepszona nawigacja za pomocą klawiatury

  • ToolStripButton teraz zezwala na fokus, gdy znajduje się w ToolStripPanel, który ma właściwość TabStop ustawioną na true.

Nazwa Wartość
Zakres Major
Wersja 4.7.2
Typ Powtórne kierowanie reklam (Retargeting)

Właściwość ContextMenuStrip.SourceControl zawiera prawidłową kontrolkę w przypadku zagnieżdżonych elementów ToolStripMenuItems

Szczegóły

W programie .NET Framework 4.7.1 i poprzednich wersjach właściwość ContextMenuStrip.SourceControl niepoprawnie zwraca wartość null, gdy użytkownik otworzy menu z zagnieżdżonych kontrolek ToolStripMenuItem. W programie .NET Framework 4.7.2 lub nowszym właściwość SourceControl jest zawsze ustawiona na rzeczywistą kontrolę źródła.

Sugestia

Jak wyrazić zgodę na te zmiany lub zrezygnować z nich Aby aplikacja mogła korzystać z tych zmian, musi działać w programie .NET Framework 4.7.2 lub nowszym. Aplikacja może korzystać z tych zmian w jeden z następujących sposobów:

  • Jest przeznaczony dla programu .NET Framework 4.7.2. Ta zmiana jest domyślnie włączona w aplikacjach Windows Forms przeznaczonych dla programu .NET Framework 4.7.2 lub nowszego.
  • Jest ona przeznaczona dla programu .NET Framework 4.7.1 lub starszej wersji i rezygnuje ze starszych zachowań ułatwień dostępu przez dodanie następującego przełącznika AppContext do sekcji <runtime> pliku app.config i ustawienie go na false, jak pokazano w poniższym przykładzie.
<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue=false"/>
</runtime>

Aplikacje przeznaczone dla programu .NET Framework 4.7.2 lub nowszego i chcą zachować starsze zachowanie, mogą wyrazić zgodę na użycie starszej wartości kontroli źródła, jawnie ustawiając ten przełącznik AppContext na true.

Nazwa Wartość
Zakres Krawędź
Wersja 4.7.2
Typ Remarketing

Interfejsy API, których dotyczy problem

Metoda PrivateFontCollection.AddFontFile zwalnia zasoby czcionek

Szczegóły

W programie .NET Framework 4.7.1 i poprzednich wersjach klasa System.Drawing.Text.PrivateFontCollection nie zwalnia zasobów czcionek GDI+ po usunięciu PrivateFontCollection dla obiektów Font dodanych do tej kolekcji przy użyciu metody AddFontFile(String). W programie .NET Framework 4.7.2 lub nowszym Dispose zwalnia czcionki GDI+ dodane do kolekcji jako pliki.

Sugestia

Jak wyrazić zgodę na te zmiany lub zrezygnować z nich Aby aplikacja mogła korzystać z tych zmian, musi działać w programie .NET Framework 4.7.2 lub nowszym. Aplikacja może korzystać z tych zmian w jeden z następujących sposobów:

  • Jest on ponownie kompilowany z myślą o platformie .NET Framework 4.7.2. Ta zmiana jest domyślnie włączona w aplikacjach Windows Forms przeznaczonych dla programu .NET Framework 4.7.2 lub nowszego.
  • Jest ona przeznaczona dla programu .NET Framework 4.7.1 lub starszej wersji i rezygnuje ze starszych zachowań ułatwień dostępu przez dodanie następującego przełącznika AppContext do sekcji <runtime> pliku app.config i ustawienie go na false, jak pokazano w poniższym przykładzie.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Drawing.Text.DoNotRemoveGdiFontsResourcesFromFontCollection=false"/>
</runtime>

Aplikacje przeznaczone dla programu .NET Framework 4.7.2 lub nowszego i chcą zachować starsze zachowanie, mogą zrezygnować z udostępniania zasobów czcionek, jawnie ustawiając ten przełącznik AppContext na true.

Nazwa Wartość
Zakres Edge
Wersja 4.7.2
Typ Retargeting (retargetowanie)

Interfejsy API, których dotyczy problem

Akcje przycisku w górę i przycisku w dół w WinForm są teraz zsynchronizowane

Szczegóły

W programie .NET Framework 4.7.1 i poprzednich wersjach akcja DomainUpDown kontrolki DomainUpDown.UpButton() jest ignorowana, gdy tekst kontrolki jest obecny, a deweloper musi użyć akcji DomainUpDown.DownButton() względem kontrolki przed użyciem akcji DomainUpDown.UpButton(). Począwszy od .NET Framework 4.7.2 zarówno akcja DomainUpDown.UpButton(), jak i akcja DomainUpDown.DownButton() działają niezależnie w tym scenariuszu i pozostają zsynchronizowane.

Sugestia

Aby aplikacja korzystała z tych zmian, musi działać w programie .NET Framework 4.7.2 lub nowszym. Aplikacja może korzystać z tych zmian w jeden z następujących sposobów:

  • Jest on ponownie kompilowany dla docelowego .NET Framework 4.7.2. Ta zmiana jest domyślnie włączona w aplikacjach Windows Forms przeznaczonych dla programu .NET Framework 4.7.2 lub nowszego.
  • Jest wykluczane starsze zachowanie przewijania przez dodanie następującego przełącznika AppContext do sekcji <runtime> pliku konfiguracyjnego aplikacji i ustawienie jego wartości na false, jak pokazano w poniższym przykładzie.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling=false"/>
</runtime>
Nazwa Wartość
Zakres Edge
Wersja 4.7.2
Typ Retargeting (remarketing)

Interfejsy API, których dotyczy problem

Windows Presentation Foundation (WPF)

Fokus klawiatury jest teraz prawidłowo przesuwany w wielu warstwach hostingu WinForms/WPF

Szczegóły

Rozważ aplikację WPF hostująca kontrolkę WinForms, która z kolei hostuje kontrolki WPF. Użytkownicy mogą nie być w stanie wyrejeścić się z warstwy WinForms, jeśli pierwsza lub ostatnia kontrolka w tej warstwie jest WPF System.Windows.Forms.Integration.ElementHost. Ta zmiana rozwiązuje ten problem, a użytkownicy mogą teraz wyjść z warstwy WinForms za pomocą klawisza Tab. Zautomatyzowane aplikacje, które polegają na nierozpraszaniu się fokusu poza warstwę WinForms, mogą już nie działać zgodnie z oczekiwaniami.

Sugestia

Deweloper, który chce wykorzystać tę zmianę, celując w wersję poniżej .NET 4.7.2, może ustawić następujący zestaw flag AppContext na wartość false, aby zmiana została włączona.

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false"/>
</runtime>
</configuration>

Aplikacje WPF muszą wyrazić zgodę na wszystkie wczesne ulepszenia ułatwień dostępu, aby uzyskać późniejsze ulepszenia. Innymi słowy, zarówno przełącznik Switch.UseLegacyAccessibilityFeatures, jak i Switch.UseLegacyAccessibilityFeatures.2 muszą być ustawione. Deweloper, który wymaga poprzedniej funkcjonalności podczas korzystania z platformy docelowej .NET 4.7.2 lub nowszej, może ustawić następującą flagę AppContext na wartość true, aby zmiana została wyłączona.

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures.2=true"/>
</runtime>
</configuration>
Nazwa Wartość
Zakres Krawędź
Wersja 4.7.2
Typ Retargeting (ponowne ukierunkowanie)

Domyślny algorytm wyznaczania wartości skrótu dla kompilatora znaczników WPF to teraz SHA256

Szczegóły

WPF MarkupCompiler udostępnia usługi kompilacji dla plików znaczników XAML. W .NET Framework 4.7.1 i starszych wersjach domyślny algorytm skrótu używany dla sum kontrolnych to SHA1. Ze względu na ostatnie obawy dotyczące zabezpieczeń sha1 ta wartość domyślna została zmieniona na SHA256, począwszy od programu .NET Framework 4.7.2. Ta zmiana ma wpływ na wszystkie generowania sum kontrolnych dla plików znaczników podczas kompilacji.

Sugestia

Deweloper, który celuje w .NET Framework 4.7.2 lub nowszy i chce przywrócić zachowanie skrótu SHA1, musi ustawić następującą flagę AppContext.

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Markup.DoNotUseSha256ForMarkupCompilerChecksumAlgorithm=true"/>
</runtime>
</configuration>

Deweloper, który chce użyć skrótu SHA256, celując w wersję platformy poniżej .NET 4.7.2, musi ustawić poniższą flagę AppContext. Należy pamiętać, że zainstalowana wersja programu .NET Framework musi być 4.7.2 lub nowsza.

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Markup.DoNotUseSha256ForMarkupCompilerChecksumAlgorithm=false"/>
</runtime>
</configuration>
Nazwa Wartość
Zakres Przejrzysty
Wersja 4.7.2
Typ retargetowanie

Obsługa zamykania AppDomain w aplikacji WPF może teraz wywołać Dispatcher.Invoke w kontekście zarządzania słabymi zdarzeniami.

Szczegóły

W programie .NET Framework 4.7.1 i starszych wersjach WPF potencjalnie tworzy System.Windows.Threading.Dispatcher w wątku finalizatora platformy .NET podczas zamykania domeny aplikacji AppDomain. Problem ten został rozwiązany w programie .NET Framework 4.7.2 i nowszych wersjach poprzez wprowadzenie obsługi wątków w procesie czyszczenia słabych zdarzeń. W związku z tym WPF potrafi wywołać Dispatcher.Invoke, aby ukończyć proces oczyszczania. W niektórych aplikacjach ta zmiana czasu działania finalizatora może potencjalnie spowodować wyjątki podczas zamykania domeny aplikacji lub procesu. Jest to zwykle widoczne w aplikacjach, które nie zamykają prawidłowo dyspozytorów uruchomionych w wątkach roboczych przed zamknięciem procesu lub AppDomainu. Takie aplikacje powinny dbać o właściwe zarządzanie okresem istnienia dyspozytorów.

Sugestia

W .NET Framework 4.7.2 i nowszych wersjach deweloperzy mogą wyłączyć tę poprawkę, aby pomóc złagodzić (ale nie wyeliminować) problemy z czasowaniem, które mogą wystąpić z powodu zmiany w procesie czyszczenia. Aby wyłączyć zmianę w procesie czyszczenia, użyj następującej flagi AppContext.

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.MS.Internal.DoNotInvokeInWeakEventTableShutdownListener=true"/>
</runtime>
</configuration>
Nazwa Wartość
Zakres Edge
Wersja 4.7.2
Typ Retargetowanie

WPF Zmiana klucza podstawowego podczas wyświetlania danych ADO w scenariuszu Master/Detail

Szczegóły

Załóżmy, że masz kolekcję ADO elementów typu Order, z relacją o nazwie "OrderDetails", która odnosi się do kolekcji elementów typu Detail za pośrednictwem klucza podstawowego "OrderID". W aplikacji WPF możesz powiązać kontrolkę listy ze szczegółami dla danej kolejności:

<ListBox ItemsSource="{Binding Path=OrderDetails}" >

gdzie DataContext jest elementem Order. WPF pobiera wartość właściwości OrderDetails, czyli kolekcję D wszystkich elementów Detail, dla których OrderID pasuje do OrderID elementu głównego. Zmiana zachowania pojawia się po zmianie klucza podstawowego OrderID elementu głównego. ADO automatycznie zmienia OrderID każdego z rekordów, których dotyczy problem, w kolekcji Details (czyli te skopiowane do kolekcji D). Ale co się stanie z D?

  • Stare zachowanie: Kolekcja D jest czyszczona. Element główny nie zgłaszać powiadomienia o zmianie właściwości OrderDetails. ListBox nadal używa kolekcji D, która jest teraz pusta.
  • Nowe zachowanie: Kolekcja D jest niezmieniona. Każdy z jego elementów generuje powiadomienie o zmianie właściwości OrderID. Pole ListBox nadal używa kolekcji D i wyświetla szczegóły za pomocą nowego OrderID. WPF implementuje nowe zachowanie, tworząc kolekcję D w inny sposób: wywołując metodę ADO DataRowView.CreateChildView(DataRelation, Boolean) z argumentem followParent ustawionym na true.

Sugestia

Aplikacja uzyskuje nowe zachowanie dzięki użyciu następującego przełącznika kontekstu aplikacji AppContext.

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Windows.Data.DoNotUseFollowParentWhenBindingToADODataRelation=false"/>
  </runtime>
</configuration>

Przełącznik domyślnie ustawia się na true (stare zachowanie) dla aplikacji przeznaczonych na platformę .NET 4.7.1 lub starszą oraz na false (nowe zachowanie) dla aplikacji przeznaczonych na platformę .NET 4.7.2 lub nowszą.

Nazwa Wartość
Zakres Małoletni
Wersja 4.7.2
Typ Retargeting (Remarketing)

Teraz FocusVisual dla RadioButton i CheckBox w WPF jest poprawnie wyświetlany, gdy kontrolki są bez zawartości.

Szczegóły

W programie .NET Framework 4.7.1 i starszych wersjach WPF System.Windows.Controls.CheckBox i System.Windows.Controls.RadioButton mają niespójne motywy oraz w motywach klasycznych i wysokich kontrastów niepoprawne wizualizacje fokusu. Te problemy występują w przypadkach, gdy kontrolki nie mają żadnego zestawu zawartości. To może powodować, że przejście między motywami staje się niejasne, a punkt skupienia trudny do zobaczenia. W programie .NET Framework 4.7.2 te wizualizacje są teraz bardziej spójne w motywach i łatwiej widoczne w motywach klasycznych i o wysokim kontraście.

Sugestia

Deweloper, który tworzy aplikacje z użyciem wersji .NET Framework 4.7.2, i chce przywrócić zachowanie z wersji .NET 4.7.1, musi ustawić następującą flagę AppContext.

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures.2=true;"/>
</runtime>
</configuration>

Deweloper, który chce skorzystać z tej zmiany, celując w wersję platformy starszą niż .NET 4.7.2, musi ustawić następujące flagi AppContext. Należy pamiętać, że wszystkie flagi muszą być poprawnie ustawione, a zainstalowana wersja .NET Framework musi wynosić co najmniej 4.7.2. Aplikacje WPF muszą zaakceptować wszystkie wcześniejsze ulepszenia ułatwień dostępu, aby otrzymać najnowsze usprawnienia. W tym celu upewnij się, że oba przełączniki AppContext "Switch.UseLegacyAccessibilityFeatures" i "Switch.UseLegacyAccessibilityFeatures.2" są ustawione na wartość false.

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false;"/>
</runtime>
</configuration>
Nazwa Wartość
Zakres Krawędź
Wersja 4.7.2
Typ Retargetowanie (ponowne kierowanie reklam)

Zaznaczenie tekstu w WPF TextBox/PasswordBox nie współgra z kolorami systemowymi.

Szczegóły

W .NET Framework 4.7.1 oraz wcześniejszych wersjach platforma WPF System.Windows.Controls.TextBox i System.Windows.Controls.PasswordBox mogła renderować wybór tekstu tylko w warstwie Adorner. W niektórych motywach systemowych tekst byłby zasłonięty, co utrudniałoby jego czytanie. W programie .NET Framework 4.7.2 lub nowszym deweloperzy mają możliwość włączenia schematu renderowania wyboru innego niż Adorner, który złagodzi ten problem.

Sugestia

Deweloper, który chce wykorzystać tę zmianę, musi odpowiednio ustawić następującą flagę AppContext. Aby korzystać z tej funkcji, zainstalowana wersja programu .NET Framework musi być 4.7.2 lub nowsza. Aby włączyć selekcję bez użycia adoratora, użyj następującej flagi AppContext.

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.Text.UseAdornerForTextboxSelectionRendering=false"/>
</runtime>
</configuration>
Nazwa Wartość
Zakres Edge
Wersja 4.7.2
Typ Remarketing (Retargeting)

Windows Workflow Foundation (WF)

Unikanie niekończącej się rekursji dla IWorkflowInstanceManagement.TransactedCancel i IWorkflowInstanceManagement.TransactedTerminate

Szczegóły

W niektórych okolicznościach podczas używania interfejsów API IWorkflowInstanceManagement.TransactedCancel lub IWorkflowInstanceManagement.TransactedTerminate do anulowania lub zakończenia wystąpienia usługi przepływu pracy, może dojść do przepełnienia stosu z powodu niekończącej się rekursji, gdy środowisko uruchomieniowe Workflow próbuje utrwalić to wystąpienie jako część przetwarzania żądania. Problem występuje, jeśli wystąpienie przepływu pracy jest w stanie, w którym oczekuje na ukończenie innego zaległego żądania programu WCF do innej usługi. Operacje TransactedCancel i TransactedTerminate tworzą elementy robocze, które są kolejkowane dla instancji usługi przepływu pracy. Te elementy robocze nie są wykonywane w ramach przetwarzania żądania TransactedCancel/TransactedTerminate. Ponieważ instancja usługi przepływu pracy jest zajęta czekaniem na zakończenie innego zaległego żądania WCF, utworzona pozycja robocza pozostaje w kolejce. Operacja TransactedCancel/TransactedTerminate zostanie ukończona i kontrolka zostanie zwrócona z powrotem do klienta. Gdy transakcja skojarzona z operacją TransactedCancel/TransactedTerminate próbuje się zatwierdzić, musi utrwalić stan wystąpienia usługi przepływu pracy. Jednak ponieważ istnieje zaległe żądanie WCF dla wystąpienia, środowisko uruchomieniowe przepływu pracy nie może utrwalać wystąpienia usługi przepływu pracy, a nieskończona pętla rekursji prowadzi do przepełnienia stosu. Ponieważ TransactedCancel i TransactedTerminate tworzą tylko element roboczy w pamięci, fakt istnienia transakcji nie ma żadnego wpływu. Wycofanie transakcji nie powoduje odrzucenia elementu roboczego. Aby rozwiązać ten problem, począwszy od programu .NET Framework 4.7.2, wprowadziliśmy AppSetting, które można dodać do web.config/app.config usługi przepływu pracy, która informuje go o ignorowaniu transakcji dla TransactedCancel i TransactedTerminate. Dzięki temu transakcja może zostać zatwierdzona bez oczekiwania na utrwalenie instancji przepływu pracy. Ustawienie aplikacji dla tej funkcji nosi nazwę microsoft:WorkflowServices:IgnoreTransactionsForTransactedCancelAndTransactedTerminate. Wartość true wskazuje, że transakcja powinna być ignorowana, co pozwala uniknąć przepełnienia stosu. Wartość domyślna tego ustawienia to false, więc nie ma to wpływu na istniejące wystąpienia usługi przepływu pracy.

Sugestia

Jeśli używasz AppFabric lub innego klienta IWorkflowInstanceManagement i napotykasz przepełnienie stosu w instancji usługi przepływu pracy podczas próby anulowania lub zakończenia instancji przepływu pracy, możesz dodać następujące ustawienia do sekcji <appSettings> pliku web.config/app.config dla usługi przepływu pracy:

<add key="microsoft:WorkflowServices:IgnoreTransactionsForTransactedCancelAndTransactedTerminate" value="true"/>

Jeśli nie napotkasz problemu, nie musisz tego robić.

Nazwa Wartość
Zakres Edge
Wersja 4.7.2
Typ Retargeting (ponowne kierowanie reklam)