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 <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
- System.Net.Security.SslStream
- System.Net.WebRequest
- System.Net.HttpWebRequest
- System.Net.FtpWebRequest
- System.Net.Mail.SmtpClient
- System.Net.Http
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
- System.Net.Security.SslStream
- System.Net.WebRequest
- System.Net.HttpWebRequest
- System.Net.FtpWebRequest
- System.Net.Mail.SmtpClient
- System.Net.Http
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
- DataContractJsonSerializer.WriteObject(Stream, Object)
- DataContractJsonSerializer.WriteObject(XmlDictionaryWriter, Object)
- DataContractJsonSerializer.WriteObject(XmlWriter, Object)
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 nafalse
, 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
<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
- System.Security.Cryptography.Pkcs.CmsSigner
- System.Security.Cryptography.Xml.SignedXml
- System.Security.Cryptography.Xml.Reference
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 nafalse
, 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:
Kontrolki ToolStripSplitButton i ComboBox obsługują wzorzec rozszerzania/zwijania .
Kontrolka ToolStripMenuItem ma wartość właściwości ControlType.MenuItemControlType .
Kontrolka ToolStripItem obsługuje właściwość NameProperty i wzorzecRozwiń/Zwiń.
Kontrolka ToolStripDropDownItem obsługuje AccessibleEvents wskazujące stateChange i NameChange po rozwinięciu lub zwinięciu listy rozwijanej.
Kontrolka ToolStripDropDownButton ma wartość właściwości ControlTypeControlType.MenuItem.
Kontrolka DataGridViewCheckBoxCell obsługuje TogglePattern.
Kontrolki NumericUpDown i DomainUpDown obsługują właściwość NameProperty i mają ControlTypeControlType.Spinner.
Ulepszenia kontrolki PropertyGrid .NET Framework 4.7.1 dodaje następujące ulepszenia kontrolki PropertyBrowser:Przycisk Details w oknie dialogowym błędu, które pojawia się, gdy użytkownik wprowadzi nieprawidłową wartość w elemencie sterującym PropertyGrid, obsługuje wzorzec Rozwiń/Zwiń, powiadomienia o zmianach stanu i nazwy oraz właściwość ControlType z wartością ControlType.MenuItem.
Okienko komunikatów wyświetlane po rozwinięciu przycisku Szczegóły okna dialogowego błędu jest teraz dostępne za pomocą klawiatury i umożliwia Narratorowi ogłoszenie zawartości komunikatu o błędzie.
AccessibleRole wierszy w kontrolce PropertyGrid zostały zmienione z "Wiersz" na "Komórka". Komórka jest mapowana na kontrolkę typu UIA "DataItem", co umożliwia obsługę odpowiednich skrótów klawiaturowych i komunikatów Narratora.
Wiersze kontrolne PropertyGrid, które reprezentują elementy nagłówka, mają wartość właściwości ControlType równą ControlType.Button, kiedy kontrolka PropertyGrid ma właściwość PropertySort ustawioną na PropertySort.Categorized.
Wiersze kontrolki PropertyGrid reprezentujące elementy nagłówka, gdy kontrolka PropertyGrid ma właściwość PropertySort ustawioną na PropertySort.Categorized obsługują wzorzec Rozwiń/Zwiń.
Ulepszona nawigacja za pomocą klawiatury między siatką a paskiem narzędzi nad nią. Naciśnięcie "Shift-Tab" powoduje teraz wybranie pierwszego przycisku ToolBar zamiast całego paska narzędzi.
PropertyGrid kontrolki wyświetlane w trybie dużego kontrastu będą teraz rysować prostokąt fokusu wokół przycisku ToolBar, który odpowiada bieżącej wartości właściwości PropertySort.
Kontrolki PropertyGrid, wyświetlane w trybie wysokiego kontrastu i z właściwością PropertySort ustawioną na PropertySort.Categorized, będą teraz wyświetlać tło nagłówków kategorii w kolorze o wysokim kontraście.
PropertyGrid kontrolki lepiej rozróżniają elementy paska narzędzi z fokusem oraz te, które wskazują bieżącą wartość właściwości PropertySort. Ta poprawka obejmuje zmianę dużego kontrastu i zmianę scenariuszy niezwiązanych z dużym kontrastem.
Elementy kontrolne paska narzędzi PropertyGrid, które wskazują bieżącą wartość właściwości PropertySort, obsługują TogglePattern.
Ulepszona obsługa narratora umożliwiająca rozróżnianie wybranego wyrównania w narzędziu do wybierania wyrównania.
Gdy na formularzu jest wyświetlana pusta kontrolka PropertyGrid, otrzyma teraz fokus, gdzie wcześniej go nie otrzymywała.
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
- ToolStripDropDownButton.CreateAccessibilityInstance()
- DomainUpDown.DomainUpDownAccessibleObject.Name
- MonthCalendar.AccessibilityObject
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 nafalse
, 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
- AutomationElementIdentifiers.LiveSettingProperty
- AutomationElementIdentifiers.LiveRegionChangedEvent
- System.Windows.Automation.AutomationLiveSetting
- AutomationProperties.LiveSettingProperty
- AutomationProperties.SetLiveSetting(DependencyObject, AutomationLiveSetting)
- AutomationProperties.GetLiveSetting(DependencyObject)
- AutomationPeer.GetLiveSettingCore()
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ą nafalse
, 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 nafalse
, 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
- Wiersze w DataGridView można teraz sortować przy użyciu klawiatury. Teraz użytkownik może użyć F3 w celu sortowania według bieżącej kolumny.
- Gdy DataGridView.SelectionMode jest ustawiona na DataGridViewSelectionMode.FullRowSelect, nagłówek kolumny zmienia kolor, aby wskazać aktualną kolumnę, gdy użytkownik przemieszcza się przez komórki w bieżącym wierszu.
- Właściwość DataGridViewCell.DataGridViewCellAccessibleObject.Parent zwraca teraz prawidłową kontrolkę nadrzędną.
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ą
ulepszona nawigacja za pomocą klawiaturyfalse
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 .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 nafalse
, 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 nafalse
, 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 nafalse
, 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ą nowegoOrderID
. WPF implementuje nowe zachowanie, tworząc kolekcję D w inny sposób: wywołując metodę ADO DataRowView.CreateChildView(DataRelation, Boolean) z argumentemfollowParent
ustawionym natrue
.
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) |