.NET Framework 4.7.x로 마이그레이션을 위한 대상 재지정 변경 사항
이 문서에서는 .NET Framework 4.7, 4.7.1및 4.7.2도입된 앱 호환성 문제를 나열합니다.
.NET Framework 4.7
ASP.NET
HttpRuntime.AppDomainAppPath에서 NullReferenceException을 발생시킵니다.
세부 정보
.NET Framework 4.6.2에서 런타임은 null 문자를 포함하는 P:System.Web.HttpRuntime.AppDomainAppPath
값을 검색할 때 T:System.NullReferenceException
예외를 발생시킵니다. .NET Framework 4.6.1 및 이전 버전에서는 T:System.ArgumentNullException
예외를 발생시킵니다.
제안
다음 중 하나를 수행하여 이 변경에 응답할 수 있습니다.
- 애플리케이션이 .NET Framework 4.6.2에서 실행되는 경우
T:System.NullReferenceException
를 처리하십시오. - .NET Framework 4.7로 업그레이드하여 이전 동작을 복원하고,
T:System.ArgumentNullException
을(를) 발생시킵니다.
이름 | 값 |
---|---|
범위 | 가장자리 |
버전 | 4.6.2 |
타입 | 대상 다시 지정 |
영향을 받는 API
세션당 동시 요청 제한
세부 정보
.NET Framework 4.6.2 이하에서 ASP.NET 동일한 Sessionid를 사용하여 요청을 순차적으로 실행하고, ASP.NET 항상 기본적으로 쿠키를 통해 Sessionid를 발급합니다. 페이지가 응답하는 데 시간이 오래 걸릴 경우 브라우저에서 F5을 누르면 서버 성능이 크게 저하될 수 있습니다. 수정에서는 대기 중인 요청을 추적하고 지정된 제한을 초과하면 요청을 종료하는 카운터를 추가했습니다. 기본값은 50입니다. 제한에 도달하면 경고가 이벤트 로그에 기록되고 HTTP 500 응답이 IIS 로그에 기록될 수 있습니다.
제안
이전 동작을 복원하려면 web.config 파일에 다음 설정을 추가하여 새 동작을 옵트아웃할 수 있습니다.
<appSettings>
<add key="aspnet:RequestQueueLimitPerSession" value="2147483647"/>
</appSettings>
이름 | 값 |
---|---|
범위 | 가장자리 |
버전 | 4.7 |
입력 | 리타겟팅 |
네트워킹
ServicePointManager.SecurityProtocol의 기본값은 SecurityProtocolType.System.Default입니다.
세부 정보
.NET Framework 4.7을 대상으로 하는 앱부터 ServicePointManager.SecurityProtocol 속성의 기본값은 SecurityProtocolType.SystemDefault. 이렇게 변경하면 SslStream(예: FTP, HTTPS 및 SMTP)을 기반으로 하는 .NET Framework 네트워킹 API가 .NET Framework에서 정의한 하드 코딩된 값을 사용하는 대신 운영 체제에서 기본 보안 프로토콜을 상속할 수 있습니다. 기본값은 운영 체제 및 시스템 관리자가 수행하는 사용자 지정 구성에 따라 다릅니다. Windows 운영 체제의 각 버전에서 기본 SChannel 프로토콜에 대한 자세한 내용은 TLS/SSL(Schannel SSP)
제안
이 변경 내용은 .NET Framework 4.7 이상 버전을 대상으로 하는 애플리케이션에 영향을 줍니다. 시스템 기본값에 의존하지 않고 정의된 프로토콜을 사용하려는 경우 ServicePointManager.SecurityProtocol 속성의 값을 명시적으로 설정할 수 있습니다. 이 변경이 바람직하지 않은 경우 애플리케이션 구성 파일의 <런타임> 섹션에 구성 설정을 추가하여 옵트아웃할 수 있습니다. 다음 예제에서는 <runtime>
섹션과 Switch.System.Net.DontEnableSystemDefaultTlsVersions
옵트아웃 스위치를 모두 보여줍니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=true" />
</runtime>
이름 | 값 |
---|---|
범위 | 사소한 |
버전 | 4.7 |
유형 | 대상 다시 지정 |
영향을 받는 API
SslStream은 TLS 경고를 지원합니다.
세부 정보
TLS 핸드셰이크가 실패한 후, 첫 번째 I/O 읽기/쓰기 작업이 수행될 때 내부 System.ComponentModel.Win32Exception 예외를 포함한 System.IO.IOException가 발생합니다.
.NET Framework 4.6.2 이하의 동작은 다른 쪽에서 핸드셰이크에 실패 후 즉시 연결을 거부할 경우, 전송 채널(일반적으로 TCP 연결)이 쓰기 또는 읽기 작업 중에 시간 초과를 발생시킨다는 것입니다.
제안
Read(Byte[], Int32, Int32)
/
Write(Byte[], Int32, Int32) 같은 네트워크 I/O API를 호출하는 애플리케이션은 IOException 또는 System.TimeoutException처리해야 합니다.
TLS 경고 기능은 기본적으로 .NET Framework 4.7부터 사용하도록 설정됩니다. .NET Framework 4.7 이상 시스템에서 실행되는 4.0에서 4.6.2까지 .NET Framework 버전을 대상으로 하는 애플리케이션은 호환성을 유지하기 위해 기능을 사용하지 않도록 설정합니다.
다음 구성 API는 .NET Framework 4.7 이상에서 실행되는 .NET Framework 4.6 이상 애플리케이션에 대한 기능을 사용하거나 사용하지 않도록 설정하는 데 사용할 수 있습니다.
프로그래밍 방식: ServicePointManager가 한 번만 초기화하기 때문에 애플리케이션이 가장 먼저 수행해야 합니다.
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>
레지스트리 키(컴퓨터 전역): .NET Framework 4.6 - 4.6.2에서 기능을 사용하도록 설정하려면 값을
false
설정합니다.Key: HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext\Switch.System.Net.DontEnableTlsAlerts - Type: String - Value: "true"
이름 | 값 |
---|---|
범위 | 가장자리 |
버전 | 4.7 |
유형 | 대상 다시 지정 |
영향을 받는 API
- System.Net.Security.SslStream
- System.Net.WebRequest
- System.Net.HttpWebRequest
- System.Net.FtpWebRequest
- System.Net.Mail.SmtpClient
- System.Net.Http
안전
CspParameters.ParentWindowHandle은 이제 HWND 값을 기대합니다.
세부 정보
.NET Framework 2.0에 도입된 ParentWindowHandle 값을 사용하면 애플리케이션에서 키에 액세스하는 데 필요한 모든 UI(예: PIN 프롬프트 또는 동의 대화 상자)가 지정된 창에 모달 자식으로 열리도록 부모 창 핸들 값을 등록할 수 있습니다. .NET Framework 4.7을 대상으로 하는 앱부터 Windows Forms 애플리케이션은 다음과 같은 코드로 ParentWindowHandle 속성을 설정할 수 있습니다.
cspParameters.ParentWindowHandle = form.Handle;
이전 버전의 .NET Framework에서 이 값은 HWND 값이 있는 메모리의 위치를 나타내는 System.IntPtr 것으로 예상되었습니다. Windows 7 및 이전 버전에서는 속성을 form.Handle로 설정해도 효과가 없었지만, Windows 8 이상 버전에서는 "System.Security.Cryptography.CryptographicException: 매개 변수가 잘못되었습니다."라는 결과가 발생합니다.
제안
부모 창 관계를 등록하려는 .NET Framework 4.7 이상을 대상으로 하는 애플리케이션은 간소화된 형식을 사용하는 것이 좋습니다.
cspParameters.ParentWindowHandle = form.Handle;
전달할 올바른 값이 form.Handle
값을 보유한 메모리 위치의 주소임을 확인한 사용자는 AppContext 스위치 Switch.System.Security.Cryptography.DoNotAddrOfCspParentWindowHandle
true
설정하여 동작 변경을 옵트아웃할 수 있습니다.
- AppContext에서 호환성 스위치를 프로그래밍 방식으로 설정하는 방법은 에서 설명한 대로입니다.
- app.config 파일의
<runtime>
섹션에 다음 줄을 추가합니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.DoNotAddrOfCspParentWindowHandle=true"/>
</runtime>
반대로 이전 .NET Framework 버전에서 애플리케이션이 로드되는 경우 .NET Framework 4.7 런타임에서 새 동작을 옵트인하려는 사용자는 AppContext 스위치를 false
설정할 수 있습니다.
이름 | 가치 |
---|---|
범위 | 사소한 |
버전 | 4.7 |
유형 | 대상 다시 지정 |
영향을 받는 API
SslStream은 TLS 경고를 지원합니다.
세부 정보
TLS 핸드셰이크가 실패한 후, 첫 번째 I/O 읽기/쓰기 작업에서 내부 System.ComponentModel.Win32Exception 예외와 함께 System.IO.IOException 예외가 발생합니다.
.NET Framework 4.6.2 이하에서는 전송 채널(일반적으로 TCP 연결)이 상대방이 핸드셰이크에 실패하고 즉시 연결을 거부하면 쓰기 또는 읽기 작업 중 시간 초과가 발생합니다.
제안
Read(Byte[], Int32, Int32)
/
Write(Byte[], Int32, Int32) 같은 네트워크 I/O API를 호출하는 애플리케이션은 IOException 또는 System.TimeoutException처리해야 합니다.
TLS 경고 기능은 기본적으로 .NET Framework 4.7부터 사용하도록 설정됩니다. .NET Framework 4.7 이상 시스템에서 실행되는 4.0에서 4.6.2까지 .NET Framework 버전을 대상으로 하는 애플리케이션은 호환성을 유지하기 위해 기능을 사용하지 않도록 설정합니다.
다음 구성 API는 .NET Framework 4.7 이상에서 실행되는 .NET Framework 4.6 이상 애플리케이션에 대한 기능을 사용하거나 사용하지 않도록 설정하는 데 사용할 수 있습니다.
프로그래밍 방식: ServicePointManager가 한 번만 초기화하기 때문에 애플리케이션이 가장 먼저 수행해야 합니다.
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);
앱 설정:
<runtime> <AppContextSwitchOverrides value="Switch.System.Net.DontEnableTlsAlerts=true"/> <!-- Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2. --> </runtime>
레지스트리 키(컴퓨터 전역): .NET Framework 4.6 - 4.6.2에서 기능을 사용하도록 설정하려면 값을
false
설정합니다.Key: HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext\Switch.System.Net.DontEnableTlsAlerts - Type: String - Value: "true"
이름 | 값 |
---|---|
범위 | 가장자리 |
버전 | 4.7 |
유형 | 리타겟팅 |
영향을 받는 API
- System.Net.Security.SslStream
- System.Net.WebRequest
- System.Net.HttpWebRequest
- System.Net.FtpWebRequest
- System.Net.Mail.SmtpClient
- System.Net.Http
WCF(Windows Communication Foundation)
DataContractJsonSerializer를 사용하여 컨트롤 문자의 직렬화는 이제 ECMAScript V6 및 V8과 호환됩니다.
세부 정보
.NET Framework 4.6.2 및 이전 버전에서 System.Runtime.Serialization.Json.DataContractJsonSerializer ECMAScript V6 및 V8 표준과 호환되는 방식으로 \b, \f 및 \t와 같은 일부 특수 컨트롤 문자를 직렬화하지 않았습니다. .NET Framework 4.7부터 이러한 제어 문자의 직렬화는 ECMAScript V6 및 V8과 호환됩니다.
제안
.NET Framework 4.7을 대상으로 하는 앱의 경우 이 기능은 기본적으로 사용하도록 설정됩니다. 이 동작이 바람직하지 않은 경우 app.config 또는 web.config 파일의 <runtime>
섹션에 다음 줄을 추가하여 이 기능을 옵트아웃할 수 있습니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Runtime.Serialization.DoNotUseECMAScriptV6EscapeControlCharacter=false" />
</runtime>
이름 | 값 |
---|---|
범위 | 가장자리 |
버전 | 4.7 |
유형 | 리타겟팅 |
영향을 받는 API
- DataContractJsonSerializer.WriteObject(Stream, Object)
- DataContractJsonSerializer.WriteObject(XmlDictionaryWriter, Object)
- DataContractJsonSerializer.WriteObject(XmlWriter, Object)
이제 WCF 메시지 보안에서 TLS1.1 및 TLS1.2를 사용할 수 있습니다.
세부 정보
.NET Framework 4.7부터 고객은 애플리케이션 구성 설정을 통해 SSL3.0 및 TLS1.0 외에도 WCF 메시지 보안에서 TLS1.1 또는 TLS1.2를 구성할 수 있습니다.
제안
.NET Framework 4.7에서는 기본적으로 WCF 메시지 보안에서 TLS1.1 및 TLS1.2에 대한 지원이 사용되지 않습니다. app.config 또는 web.config 파일의 <runtime>
섹션에 다음 줄을 추가하여 사용하도록 설정할 수 있습니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols=false;Switch.System.Net.DontEnableSchUseStrongCrypto=false" />
</runtime>
이름 | 값 |
---|---|
범위 | 가장자리 |
버전 | 4.7 |
유형 | 리타겟팅 |
WPF(Windows Presentation Foundation)
터치 사용 시스템에서 System.Windows.Input.PenContext.Disable를 호출하면 ArgumentException이 throw될 수 있습니다.
세부 정보
일부 경우에 터치 사용 시스템에서 내부 System.Windows.Intput.PenContext.Disable 메서드를 호출하면 재진입으로 인해 처리되지 않은 T:System.ArgumentException
가 발생할 수 있습니다.
제안
이 문제는 .NET Framework 4.7에서 해결되었습니다. 예외를 방지하려면 .NET Framework 4.7 이상 버전으로 업그레이드하세요.
이름 | 값 |
---|---|
범위 | 가장자리 |
버전 | 4.6.1 |
유형 | 리타겟팅 |
ImageSourceConverter.ConvertFrom 예외 처리 코드에서 발생한 NullReferenceException
세부 정보
ConvertFrom(ITypeDescriptorContext, CultureInfo, Object)의 예외 처리 코드에서 오류가 발생하여 의도했던 예외(System.IO.DirectoryNotFoundException 또는 System.IO.FileNotFoundException)가 아닌 잘못된 System.NullReferenceException이 던져졌습니다. 이 변경은 메서드가 올바른 예외를 throw할 수 있도록 해당 오류를 수정합니다.
기본적으로 .NET Framework 4.6.2 이하를 대상으로 하는 모든 애플리케이션은 호환성을 위해 계속 System.NullReferenceException throw합니다. .NET Framework 4.7 이상을 대상으로 하는 개발자는 올바른 예외를 확인해야 합니다.
제안
.NET Framework 4.7 이상을 대상으로 할 때 System.NullReferenceException 가져오기로 되돌리려는 개발자는 애플리케이션의 App.config 파일에 다음을 추가/병합할 수 있습니다.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Media.ImageSourceConverter.OverrideExceptionWithNullReferenceException=true"/>
</runtime>
</configuration>
이름 | 값 |
---|---|
범위 | 가장자리 |
버전 | 4.7 |
타입 | 리타겟팅 |
영향을 받는 API
별 열에 대한 공간의 WPF 그리드 할당
세부 정보
.NET Framework 4.7부터 WPF는 Grid *열에 공간을 할당하는 데 사용하는 알고리즘을 대체합니다. 이렇게 하면 여러 경우에 *열에 할당된 실제 너비가 변경됩니다.
- 하나 이상의 *열에 최소 또는 최대 너비가 설정되어 있어 해당 열의 비례 배분을 재정의하는 경우 (최소 너비는 명시적 MinWidth 선언에서 파생되거나 열의 콘텐츠에서 가져온 암시적 최소값에서 파생될 수 있습니다. 최대 너비는 MaxWidth 선언에서만 명시적으로 정의할 수 있습니다.)
- 하나 이상의 *열이 10^298보다 큰 매우 큰 *가중치를 선언하는 경우.
- 가중치가 서로 충분히 달라 부동 소수점 불안정성(오버플로, 언더플로, 정밀도 손실)이 발생할 경우.
- 레이아웃 반올림이 설정되어 있고 유효 디스플레이 DPI가 충분히 높은 경우 처음 두 경우에서 새 알고리즘에 의해 생성된 너비는 이전 알고리즘에서 생성된 너비와 크게 다를 수 있습니다. 마지막 경우 차이는 최대 1~2픽셀입니다.
새 알고리즘은 이전 알고리즘에 있는 몇 가지 버그를 수정합니다.
열로의 할당 총량이 그리드의 너비를 초과할 수 있습니다. 이 문제는 비례 공유가 최소 크기보다 작은 열에 공간을 할당할 때 발생할 수 있습니다. 알고리즘은 최소 크기를 할당하여 다른 열에 사용할 수 있는 공간을 줄입니다. 할당할 *열이 남아 있지 않으면 총 할당이 너무 커집니다.
총 할당은 그리드의 너비에 미치지 못할 수 있습니다. 이는 #1에 대한 이중 문제이며, 비례 공유가 최대 크기보다 큰 열에 할당할 때 발생하며 여유 시간을 차지하기 위해 *열이 남아 있지 않습니다.
두 개의 *열은 해당 *가중치에 비례하지 않는 할당을 받을 수 있습니다. 이것은 *-columns A, B 및 C(해당 순서)에 할당할 때 B의 비례 공유가 그 최소(또는 최대) 제약 조건을 위반하는 경우 발생하는, #1/#2의 덜 엄격한 버전입니다. 위와 같이, C 열에 할당된 공간이 변경되어 A보다 비례 할당을 더 적거나 많게 받습니다.
가중치가 매우 큰 열(예:> 10^298)은 모두 가중치가 10^298인 것처럼 처리됩니다. 둘 사이의 비례 차이 (및 가중치가 약간 더 작은 열 사이의 비례 차이)는 고려되지 않습니다.
무한 가중치가 있는 열은 제대로 처리되지 않습니다. (실제로 무한대로 무게를 설정할 수는 없지만 이는 인위적인 제한 사항입니다. 할당 코드가 처리하려고 했지만 잘못된 작업을 수행했습니다.)
오버플로, 언더플로, 정밀도 손실 및 유사한 부동 소수점 문제를 방지하는 동안 발생하는 몇 가지 사소한 문제
DPI가 충분히 높을 때 레이아웃 반올림에 대한 조정이 올바르지 않습니다. 새 알고리즘은 다음 조건을 충족하는 결과를 생성합니다.
- *열에 할당된 실제 너비는 최소 너비보다 작거나 최대 너비보다 크지 않습니다.
- 최소 또는 최대 너비가 할당되지 않은 각 *열에는 *가중치에 비례하는 너비가 할당됩니다. 정확하게 말하자면, 두 열이 각각 너비 x* 및 y*로 선언되고 두 열이 최소 또는 최대 너비를 받지 못하면 열에 할당된 실제 너비 v와 w의 비율은 v/w == x/ y와 같습니다.
- "비례" *열에 할당된 총 너비는 제한된 열(고정, 자동 및 최소 또는 최대 너비로 할당된 *열)에 공간을 할당한 후 남은 사용할 수 있는 공간과 같습니다. 예를 들어 최소 너비의 합계가 Grid의 사용 가능한 너비를 초과하는 경우 0일 수 있습니다.
- 이러한 모든 문은 "이상적인" 레이아웃과 관련하여 해석되어야 합니다. 레이아웃 반올림이 적용되는 경우 실제 너비는 1픽셀만큼 이상적인 너비와 다를 수 있습니다.
메모
이 문서의 열과 너비에 대한 모든 내용은 행과 높이에도 적용됩니다.
제안
기본적으로 .NET Framework 4.7부터 .NET Framework 버전을 대상으로 하는 앱에는 새 알고리즘이 표시되며, .NET Framework 4.6.2 이전 버전을 대상으로 하는 앱에는 이전 알고리즘이 표시됩니다.
기본값을 재정의하려면 다음 구성 설정을 사용합니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true" />
</runtime>
true
값은 이전 알고리즘을 선택하고 false
새 알고리즘을 선택합니다.
이름 | 값 |
---|---|
범위 | 사소한 |
버전 | 4.7 |
유형 | 대상 다시 지정 |
WPF Pointer-Based 터치 스택
세부 정보
이 변경은 선택적 WM_POINTER 기반 WPF 터치/스타일러스 스택을 사용하도록 설정하는 기능을 추가합니다. 이를 명시적으로 사용하도록 설정하지 않은 개발자는 WPF 터치/스타일러스 동작이 변경되지 않아야 합니다. 선택적 WM_POINTER 기반 터치/스타일러스 스택의 현재 알려진 문제:
- 실시간 잉킹은 지원되지 않습니다.
- 잉킹 기능과 StylusPlugins는 여전히 작동하겠지만, 사용자 인터페이스(UI) 스레드에서 처리되기 때문에 성능 저하가 발생할 수 있습니다.
- 터치/스타일러스 이벤트에서 마우스 이벤트로 승격의 변경으로 인한 동작 변경
- 조작 방식은 다르게 작동할 수 있습니다.
- 끌어서 놓기에서 터치 입력에 대한 적절한 피드백이 표시되지 않음
- 스타일러스 입력에는 영향을 주지 않습니다.
- 터치 또는 스타일러스를 사용하는 이벤트에서는 드래그 앤 드롭을 더 이상 시작할 수 없습니다.
- 이로 인해 마우스 입력이 검색될 때까지 애플리케이션의 응답이 중지될 수 있습니다.
- 대신 개발자는 마우스 이벤트를 통해 드래그 앤 드롭을 시작해야 합니다.
제안
이 스택을 사용하려는 개발자는 애플리케이션의 App.config 파일에 다음을 추가/병합할 수 있습니다.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Input.Stylus.EnablePointerSupport=true"/>
</runtime>
</configuration>
이 값을 제거하거나 값을 false로 설정하면 이 선택적 스택이 해제됩니다. 이 스택은 Windows 10 크리에이터스 업데이트 이상에서만 사용할 수 있습니다.
이름 | 가치 |
---|---|
범위 | 가장자리 |
버전 | 4.7 |
유형 | 대상 다시 지정 |
WF(Windows Workflow Foundation)
워크플로 체크섬이 MD5에서 SHA1로 변경됨
세부 정보
Visual Studio에서 디버깅을 지원하기 위해 워크플로 런타임은 해시 알고리즘을 사용하여 워크플로 인스턴스에 대한 체크섬을 생성합니다. .NET Framework 4.6.2 및 이전 버전에서 워크플로 체크섬 해시는 MD5 알고리즘을 사용하여 FIPS 사용 시스템에 문제를 일으켰습니다. .NET Framework 4.7부터 알고리즘은 SHA1입니다. 코드에서 이러한 체크섬을 유지하면 호환되지 않습니다.
제안
체크섬 오류로 인해 코드가 워크플로 인스턴스를 로드할 수 없는 경우 AppContext
스위치 "Switch.System.Activities.UseMD5ForWFDebugger"를 true로 설정해 보세요. 코드에서:
System.AppContext.SetSwitch("Switch.System.Activities.UseMD5ForWFDebugger", true);
또는 구성 중:
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Activities.UseMD5ForWFDebugger=true" />
</runtime>
</configuration>
이름 | 값 |
---|---|
범위 | 사소한 |
버전 | 4.7 |
유형 | 대상 다시 지정 |
.NET Framework 4.7.1
ASP.NET
.NET Framework 4.7.1의 ASP.NET 접근성 향상
세부 정보
.NET Framework 4.7.1부터 ASP.NET ASP.NET Web Controls가 Visual Studio의 접근성 기술과 함께 작동하여 ASP.NET 고객을 더 잘 지원하는 방법을 개선했습니다. 여기에는 다음과 같은 변경 내용이 포함되었습니다.
- 세부 정보 보기 마법사의 필드 추가 대화 상자 또는 ListView 마법사의 ListView 구성 대화 상자와 같이 컨트롤에서 누락된 UI 접근성 패턴을 구현하기 위한 변경 내용입니다.
- 데이터 호출기 필드 편집기처럼 고대비 모드에서 디스플레이를 개선하기 위한 변경 내용입니다.
- DataPager 컨트롤의 페이저 필드 편집 마법사의 필드 대화 상자, ObjectContext 구성 대화 상자 또는 데이터 원본 구성 마법사의 데이터 선택 구성 대화 상자와 같이 컨트롤의 키보드 탐색 환경을 개선하기 위한 변경 내용입니다.
제안
이러한 변경 내용을 옵트인하거나 옵트아웃하는 방법 Visual Studio Designer가 이러한 변경 내용을 활용하려면 .NET Framework 4.7.1 이상에서 실행해야 합니다. 웹 애플리케이션은 다음 방법 중 하나를 통해 이러한 변경 내용을 활용할 수 있습니다.
- 기본적으로 다음 AppContext 스위치를 사용하여 새로운 접근성 기능을 지원하는 Visual Studio 2017 15.3 이상을 설치합니다.
- 다음 예제와 같이
Switch.UseLegacyAccessibilityFeatures
AppContext 스위치를 devenv.exe.config 파일의<runtime>
섹션에 추가하고false
설정하여 레거시 접근성 동작을 옵트아웃합니다.
<?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>
.NET Framework 4.7.1 이상을 대상으로 하고 레거시 접근성 동작을 유지하려는 애플리케이션은 이 AppContext 스위치를 true
명시적으로 설정하여 레거시 접근성 기능 사용을 옵트인할 수 있습니다.
이름 | 값 |
---|---|
범위 | 사소한 |
버전 | 4.7.1 |
타입 | 리타겟팅 |
핵심
SerialPort 백그라운드 스레드 예외 발생
세부 정보
SerialPort 스트림으로 생성된 백그라운드 스레드는 이제 OS 예외가 발생해도 더 이상 프로세스를 종료하지 않습니다.
.NET Framework 4.7 및 이전 버전을 대상으로 하는 애플리케이션에서는 SerialPort 스트림으로 만든 백그라운드 스레드에서 운영 체제 예외가 throw될 때 프로세스가 종료됩니다.
.NET Framework 4.7.1 이상 버전을 대상으로 하는 애플리케이션에서 백그라운드 스레드는 활성 직렬 포트와 관련된 OS 이벤트를 대기하며 직렬 포트의 갑작스러운 제거와 같은 경우에 충돌할 수 있습니다.
제안
.NET Framework 4.7.1을 대상으로 하는 앱의 경우 app.config
파일의 <runtime>
섹션에 다음을 추가하여 바람직하지 않은 경우 예외 처리를 옵트아웃할 수 있습니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.Ports.DoNotCatchSerialStreamThreadExceptions=true" />
</runtime>
이전 버전의 .NET Framework를 대상으로 하지만 .NET Framework 4.7.1 이상에서 실행되는 앱의 경우 app.config
파일의 <runtime>
섹션에 다음을 추가하여 예외 처리를 옵트인할 수 있습니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.Ports.DoNotCatchSerialStreamThreadExceptions=false" />
</runtime>
이름 | 값 |
---|---|
범위 | 사소한 |
버전 | 4.7.1 |
유형 | 리타겟팅 |
영향을 받는 API
ServiceBase가 OnStart 예외를 전파하지 않음
세부 정보
.NET Framework 4.7 및 이전 버전에서는 서비스 시작 시 예외가 발생한 경우 그 예외가 ServiceBase.Run호출자에게 전파되지 않습니다.
.NET Framework 4.7.1을 대상으로 하는 애플리케이션부터, 런타임은 시작에 실패한 서비스에 대해 예외를 ServiceBase.Run로 전달합니다.
제안
서비스 시작 시 예외가 있는 경우 해당 예외가 전파됩니다. 이는 서비스가 시작되지 않는 경우를 진단하는 데 도움이 됩니다.
이 동작이 바람직하지 않은 경우 애플리케이션 구성 파일의 runtime
섹션에 다음 AppContextSwitchOverrides
요소를 추가하여 옵트아웃할 수 있습니다.
<AppContextSwitchOverrides value="Switch.System.ServiceProcess.DontThrowExceptionsOnStart=true" />
애플리케이션이 4.7.1보다 이전 버전을 대상으로 하지만 이 동작을 사용하려는 경우 애플리케이션 구성 파일의 runtime
섹션에 다음 AppContextSwitchOverrides
요소를 추가합니다.
<AppContextSwitchOverrides value="Switch.System.ServiceProcess.DontThrowExceptionsOnStart=false" />
이름 | 값 |
---|---|
범위 | 사소한 |
버전 | 4.7.1 |
유형 | 대상 다시 지정 |
영향을 받는 API
안전
기본 SignedXML 및 SignedXMS 알고리즘이 SHA256으로 변경됨
세부 정보
.NET Framework 4.7 이하에서 SignedXML 및 SignedCMS는 일부 작업에 대해 기본적으로 SHA1로 설정됩니다. .NET Framework 4.7.1부터 SHA256은 기본적으로 이러한 작업에 사용하도록 설정됩니다. SHA1은 더 이상 안전한 것으로 간주되지 않으므로 이 변경이 필요합니다.
제안
SHA1(안전하지 않음) 또는 SHA256이 기본적으로 사용되는지 여부를 제어하는 두 가지 새로운 컨텍스트 전환 값이 있습니다.
- Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms
- Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms .NET Framework 4.7.1 이상 버전을 대상으로 하는 애플리케이션의 경우 SHA256을 사용할 수 없는 경우 앱 구성 파일의 런타임 섹션에 다음 구성 스위치를 추가하여 기본값을 SHA1로 복원할 수 있습니다.
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms=true;Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms=true" />
.NET Framework 4.7 및 이전 버전을 대상으로 하는 애플리케이션의 경우 앱 구성 파일의 런타임 섹션에 다음 구성 스위치를 추가하여 이 변경을 옵트인할 수 있습니다.
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms=false;Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms=false" />
이름 | 값 |
---|---|
범위 | 사소한 |
버전 | 4.7.1 |
유형 | 대상 다시 지정 |
영향을 받는 API
- System.Security.Cryptography.Pkcs.CmsSigner
- System.Security.Cryptography.Xml.SignedXml
- System.Security.Cryptography.Xml.Reference
SignedXml.GetPublicKey는 대상 변경 없이 net462(또는 lightup)에서 RSACng를 반환합니다.
세부 정보
.NET Framework 4.6.2부터 SignedXml.GetPublicKey 메서드에서 반환된 개체의 구체적인 형식이 CryptoServiceProvider 구현에서 Cng 구현으로 변경되었습니다(단점 없이). 이것은 구현이 certificate.PublicKey.Key
사용에서 RSACertificateExtensions.GetRSAPublicKey로 전달되는 내부 certificate.GetAnyPublicKey
사용으로 변경되었기 때문입니다.
제안
.NET Framework 4.7.1에서 실행되는 앱부터 앱 구성 파일의 런타임 섹션에 다음 구성 스위치를 추가하여 .NET Framework 4.6.1 이전 버전에서 기본적으로 사용되는 CryptoServiceProvider 구현을 사용할 수 있습니다.
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.SignedXmlUseLegacyCertificatePrivateKey=true" />
이름 | 값 |
---|---|
범위 | 가장자리 |
버전 | 4.6.2 |
유형 | 대상 다시 지정 |
영향을 받는 API
WCF(Windows Communication Foundation)
일부 .NET SDK 도구에 대한 접근성 향상
세부 정보
.NET Framework SDK 4.7.1에서는 다양한 접근성 문제를 해결하여 SvcConfigEditor.exe 및 SvcTraceViewer.exe 도구가 개선되었습니다. 이 중 대부분은 이름이 정의되지 않거나 특정 UI 자동화 패턴이 올바르게 구현되지 않는 것과 같은 작은 문제였습니다. 많은 사용자가 이러한 잘못된 값을 인식하지 못하지만 화면 읽기 프로그램과 같은 보조 기술을 사용하는 고객은 이러한 SDK 도구에 더 쉽게 액세스할 수 있습니다. 물론 이러한 수정 사항은 키보드 포커스 순서와 같은 일부 이전 동작을 변경합니다. 이러한 도구의 모든 접근성 수정 사항을 가져오기 위해 app.config 파일에 다음을 수행할 수 있습니다.
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false"/>
</runtime>
이름 | 값 |
---|---|
범위 | 가장자리 |
버전 | 4.7.1 |
유형 | 대상 다시 지정 |
Windows Forms
Windows Forms 컨트롤의 접근성 향상
세부 정보
Windows Forms는 Windows Forms 고객을 더 잘 지원하기 위해 접근성 기술과 함께 작동하는 방식을 개선하고 있습니다. 여기에는 .NET Framework 4.7.1부터 다음과 같은 변경 내용이 포함됩니다.
- 고대비 모드에서 디스플레이를 개선하기 위한 변경 내용입니다.
- 속성 브라우저 사용 경험을 개선하기 위한 변경 내용입니다. 속성 브라우저 개선 사항은 다음과 같습니다.
- 다양한 드롭다운 선택 창을 통해 키보드 탐색을 개선합니다.
- 불필요한 탭 정지를 줄입니다.
- 컨트롤 형식에 대한 더 나은 보고.
- 내레이터 동작이 향상되었습니다.
- 컨트롤에서 누락된 UI 접근성 패턴을 구현하기 위한 변경 내용입니다.
제안
이러한 변경 내용을 옵트인하거나 옵트아웃하는 방법 애플리케이션이 이러한 변경 내용을 활용하려면 .NET Framework 4.7.1 이상에서 실행해야 합니다. 애플리케이션은 다음 방법 중 하나에서 이러한 변경 내용을 활용할 수 있습니다.
- .NET Framework 4.7.1을 대상으로 다시 컴파일됩니다. 이러한 접근성 변경은 .NET Framework 4.7.1 이상을 대상으로 하는 Windows Forms 애플리케이션에서 기본적으로 사용하도록 설정됩니다.
- "app.config 파일의
<runtime>
섹션에 다음 AppContext 스위치를 추가하고false
로 설정하여, 다음의 예시와 같이 레거시 접근성 동작을 비활성화합니다."
<?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>
.NET Framework 4.7.1 이상을 대상으로 하고 레거시 접근성 동작을 유지하려는 애플리케이션은 이 AppContext 스위치를 true
명시적으로 설정하여 레거시 접근성 기능 사용을 옵트인할 수 있습니다.
UI 자동화에 대한 개요는 UI 자동화 개요참조하세요.
UI 자동화 패턴 및 속성 대한 지원이 추가됨
접근성 클라이언트는 공개적으로 설명된 일반적인 호출 패턴을 사용하여 새로운 WinForms 접근성 기능을 활용할 수 있습니다. 이러한 패턴은 WinForms 관련이 아닙니다. 예를 들어 접근성 클라이언트는 IAccessible 인터페이스(MAAS)에서 QueryInterface 메서드를 호출하여 IServiceProvider 인터페이스를 가져올 수 있습니다. 이 인터페이스를 사용할 수 있는 경우 클라이언트는 QueryService 메서드를 사용하여 IAccessibleEx 인터페이스를 요청할 수 있습니다. 보다 자세한 내용은 클라이언트에서 IAccessibleEx 사용을 참조하세요. .NET Framework 4.7.1부터 IServiceProvider 및 IAccessibleEx(해당하는 경우)는 WinForms 접근성 개체에 사용할 수 있습니다.
.NET Framework 4.7.1은 다음 UI 자동화 패턴 및 속성에 대한 지원을 추가합니다.
ToolStripSplitButton 및 ComboBox 컨트롤은 확장/축소 패턴지원합니다.
ToolStripMenuItem 컨트롤에는 ControlType의 속성 값이 ControlType.MenuItem있습니다.
ToolStripItem 컨트롤은 NameProperty 속성과확장/축소 패턴지원합니다.
ToolStripDropDownItem 컨트롤은 드롭다운이 확장되거나 축소될 때 StateChange 및 NameChange를 나타내는 AccessibleEvents을 지원합니다.
ToolStripDropDownButton 컨트롤은 ControlType 속성의 값이 ControlType.MenuItem입니다.
DataGridViewCheckBoxCell 컨트롤은 TogglePattern지원합니다.
NumericUpDown 및 DomainUpDown 컨트롤은 NameProperty 속성을 지원하고 ControlType가 ControlType.Spinner입니다.
PropertyGrid 컨트롤의 개선 사항 .NET Framework 4.7.1은 다음과 같은 개선 사항을 PropertyGrid 컨트롤에 추가합니다.사용자가 PropertyGrid 컨트롤에 잘못된 값을 입력할 때 표시되는 오류 대화 상자의 세부 정보 버튼은 확장/축소 패턴, 상태와 이름 변경에 대한 알림, 그리고 값이 ControlType.MenuItem인 ControlType 속성을 지원합니다.
이제 오류 대화 상자의 세부 정보 단추가 확장될 때 표시되는 메시지 창에 키보드에 액세스할 수 있으며 내레이터가 오류 메시지의 내용을 알려줄 수 있습니다.
PropertyGrid 컨트롤의 AccessibleRole 행의 이름이 "Row"에서 "Cell"로 변경되었습니다. 셀은 UIA ControlType "DataItem"에 매핑되므로 적절한 단축키 및 내레이터 알림을 지원할 수 있습니다.
PropertyGrid 컨트롤에 PropertySort 속성이 PropertySort.Categorized으로 설정된 경우, 헤더 항목을 나타내는 PropertyGrid 컨트롤 행은 ControlType 속성 값이 ControlType.Button입니다.
PropertyGrid 컨트롤에 PropertySort 속성이 PropertySort.Categorized으로 설정된 경우, 헤더 항목을 나타내는 PropertyGrid 제어 행은 확장/축소 패턴를 지원합니다.
표와 위의 도구 모음 간 키보드 탐색 기능이 향상되었습니다. 이제 "Shift-Tab"을 누르면 전체 도구 모음 대신 첫 번째 도구 모음 단추가 선택됩니다.
고대비 모드로 표시되는 PropertyGrid 컨트롤은 이제 현재 PropertySort 속성 값에 해당하는 도구 모음 단추 주위에 포커스 사각형을 그립니다.
PropertyGrid 컨트롤이 고대비 모드로 표시되고 PropertySort 속성이 PropertySort.Categorized로 설정되면 범주 머리글의 배경이 고대비 색으로 표시됩니다.
PropertyGrid 컨트롤은 포커스가 있는 ToolBar 항목과 PropertySort 속성의 현재 값을 나타내는 도구 모음 항목을 더 잘 구분합니다. 이 수정은 고대비 변경 및 비고대비 환경에 대한 변경으로 구성됩니다.
PropertyGrid 도구 모음 항목은 PropertySort 속성의 현재 값을 나타내며 TogglePattern를 지원합니다.
내레이터 지원이 정렬 선택 도구에서 선택한 정렬을 구분하는 데 있어 향상되었습니다.
이제 양식에 빈 PropertyGrid 컨트롤이 표시되면 이전에는 포커스를 받지 않았던 경우에도 포커스를 받게 됩니다.
고대비 테마에서 운영 체제 정의 색상 사용
- 기본 스타일인 FlatStyle.System로 설정된 FlatStyle 속성을 가진 Button 및 CheckBox 컨트롤은 이제 선택 시 고대비 테마에서 OS에서 정의한 색상을 사용합니다. 이전에는 텍스트와 배경색이 대조되지 않아 읽기가 어려웠습니다.
-
Button, CheckBox, RadioButton, Label, LinkLabel및 Enabled 속성이 false로 설정된GroupBox 컨트롤은 음영 처리된 색을 사용하여 고대비 테마로 텍스트를 렌더링하여 배경 대비가 낮아집니다. 이제 이러한 컨트롤은 OS에서 정의한 "사용 안 함 텍스트" 색을 사용합니다. 이 수정 사항은
FlatStyle
속성이 FlatStyle.System이외의 값으로 설정된 컨트롤에 적용됩니다. 후자의 컨트롤은 OS에서 렌더링됩니다. - 이제 DataGridView는 현재 포커스가 있는 셀의 내용을 둘러싸는 보이는 사각형을 렌더링합니다. 이전에는 특정 고대비 테마에서 볼 수 없었습니다.
- Enabled 속성이 false로 설정된 ToolStripMenuItem 컨트롤은 이제 OS에서 정의한 "사용 안 함 텍스트" 색을 사용합니다.
- ToolStripMenuItem 컨트롤은 true로 설정된 Checked 속성을 가진 경우 연결된 확인 표시를 이제 시스템 대비 색상으로 렌더링합니다. 이전에는 확인 표시의 색상이 충분히 선명하지 않아 고대비 테마에서 잘 보이지 않았습니다. 참고: Windows 10에서는 일부 고대비 시스템 색의 값이 변경되었습니다. Windows Forms 프레임워크는 Win32 프레임워크를 기반으로 합니다. 최상의 경험을 위해 최신 버전의 Windows에서 실행하며, 테스트 애플리케이션에 app.manifest 파일을 추가한 후 다음 코드를 주석 처리 해제하여 최신 OS 변경 사항을 선택하여 사용합니다.
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
향상된 키보드 탐색
- ComboBox 컨트롤의 DropDownStyle 속성이 ComboBoxStyle.DropDownList 설정되고 폼의 탭 순서에서 첫 번째 컨트롤인 경우 이제 키보드를 사용하여 부모 폼을 열 때 포커스 사각형이 표시됩니다. 이 변경 전에 키보드 포커스가 이 컨트롤에 있었지만 포커스 표시기가 렌더링되지 않았습니다.
향상된 내레이터 기능 지원
MonthCalendar 컨트롤은 이전에는 내레이터가 읽을 수 없었던 컨트롤 값을 읽을 수 있도록 하는 기능을 비롯하여, 컨트롤에 액세스할 수 있는 보조 기술 지원을 추가했습니다.
이제 CheckedListBox 컨트롤은 CheckBox.CheckState 속성이 변경되었을 때 내레이터에 알릴 수 있습니다. 이전에는 내레이터가 알림을 받지 못했기 때문에 사용자에게 CheckState 속성이 업데이트되었다는 알림을 받지 못했습니다.
LinkLabel 컨트롤에서 내레이터에게 컨트롤의 텍스트를 알릴 수 있는 방식이 변경되었습니다. 이전에 내레이터는 이 텍스트를 두 번 발표하고 사용자에게 표시되지 않더라도 "&" 기호를 실제 텍스트로 읽었습니다. 중복된 텍스트는 내레이터 알림에서 제거되었으며 불필요한 "&" 기호도 제거되었습니다.
이제 DataGridViewCell 컨트롤 형식은 읽기 전용 상태를 내레이터 및 기타 보조 기술에 올바르게 보고합니다.
이제 내레이터는 [Multiple-Document Interface]~/docs/framework/winforms/advanced/multiple-document-interface-mdi-applications.md) 애플리케이션에서 자식 창의 시스템 메뉴를 읽을 수 있습니다.
이제 내레이터는 ToolStripMenuItem 컨트롤을 읽을 수 있으며, ToolStripItem.Enabled 속성이 false로 설정됩니다. 이전에는 내레이터가 비활성화된 메뉴 항목에 집중하여 콘텐츠를 읽을 수 없었습니다.
이름 | 값 |
---|---|
범위 | 주요 |
버전 | 4.8 |
타입 | 대상 다시 지정 |
영향을 받는 API
- ToolStripDropDownButton.CreateAccessibilityInstance()
- DomainUpDown.DomainUpDownAccessibleObject.Name
- MonthCalendar.AccessibilityObject
WPF(Windows Presentation Foundation)
WPF의 접근성 향상
세부 정보
고대비 향상
- 이제 Expander 컨트롤에 대한 포커스가 표시됩니다. 이전 버전의 .NET Framework에서는 그렇지 않았습니다.
- 이제 선택되었을 때 CheckBox 및 RadioButton 컨트롤의 텍스트가 이전 .NET Framework 버전보다 더 쉽게 보입니다.
- 비활성화된 ComboBox 테두리는 이제 비활성화된 텍스트와 같은 색입니다. 이전 버전의 .NET Framework에서는 그렇지 않았습니다.
- 비활성화되고 포커스가 있는 단추는 이제 올바른 테마 색을 사용합니다. 이전 버전의 .NET Framework에서는 그렇지 않았습니다.
- 이제 ComboBox 컨트롤의 스타일이 ToolBar.ComboBoxStyleKey설정되면 드롭다운 단추가 표시됩니다. 이전 버전의 .NET Framework에서는 그렇지 않았습니다.
- 이제 DataGrid 컨트롤의 정렬 표시기 화살표에서 테마 색을 사용합니다. 이전 버전의 .NET Framework에서는 그렇지 않았습니다.
- 이제 기본 하이퍼링크 스타일이 마우스 위에 있는 올바른 테마 색으로 변경됩니다. 이전 버전의 .NET Framework에서는 그렇지 않았습니다.
- 이제 라디오 단추의 키보드 포커스가 표시됩니다. 이전 버전의 .NET Framework에서는 그렇지 않았습니다.
- 이제 DataGrid 컨트롤의 확인란 열에서 키보드 포커스 피드백에 필요한 색을 사용합니다. 이전 버전의 .NET Framework에서는 그렇지 않았습니다.
- 이제 키보드 포커스 시각적 표시가 ComboBox 및 ListBox 컨트롤에 표시됩니다. 이전 버전의 .NET Framework에서는 그렇지 않았습니다.
화면 읽기 프로그램 상호 작용 개선
- Expander 컨트롤은 이제 화면 판독기에서 그룹(확장/축소)으로 올바르게 발표됩니다.
- 이제 DataGridCell 컨트롤이 화면 판독기에서 지역화된 데이터 그리드 셀로 올바르게 읽힙니다.
- 이제 화면 읽기 프로그램이 편집 가능한 ComboBox의 이름을 알립니다.
- PasswordBox 컨트롤은 화면 읽기 프로그램에서 더 이상 "보기에 항목 없음"으로 읽히지 않습니다.
LiveRegion 지원
내레이터와 같은 화면 읽기 프로그램은 일반적으로 현재 포커스가 있는 UI 요소를 설명하여 애플리케이션의 UI(사용자 인터페이스)를 이해하는 데 도움이 됩니다. 그러나 UI 요소가 화면 어딘가에 변경되고 포커스가 없는 경우 사용자에게 알리지 않고 중요한 정보를 놓칠 수 있습니다. LiveRegions는 이 문제를 해결하기 위한 것입니다. 개발자는 이를 사용하여 화면 읽기 프로그램 또는 다른 UI 자동화 클라이언트에 UI 요소에 대한 중요한 변경 사항이 적용되었음을 알릴 수 있습니다. 그러면 화면 읽기 프로그램에서 사용자에게 이 변경 사항을 알리는 방법과 시기를 결정할 수 있습니다. 또한 LiveSetting 속성을 사용하면 화면 읽기 프로그램에서 사용자에게 UI 변경 내용을 알리는 것이 얼마나 중요한지 알 수 있습니다.
제안
이러한 변경 내용을 옵트인하거나 옵트아웃하는 방법
애플리케이션이 이러한 변경 내용을 활용하려면 .NET Framework 4.7.1 이상에서 실행해야 합니다. 애플리케이션은 다음 방법 중 하나에서 이러한 변경 내용을 활용할 수 있습니다.
.NET Framework 4.7.1을 대상으로 하십시오. 권장되는 방법입니다. 이러한 접근성 변경은 .NET Framework 4.7.1 이상을 대상으로 하는 WPF 애플리케이션에서 기본적으로 사용하도록 설정됩니다.
다음 예제와 같이 앱 구성 파일의
<runtime>
섹션에 AppContext Switch를 추가하고false
로 설정하여 레거시 접근성 동작을 비활성화합니다.<?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>
.NET Framework 4.7.1 이상을 대상으로 하고 레거시 접근성 동작을 유지하려는 애플리케이션은 이 AppContext 스위치를 true
명시적으로 설정하여 레거시 접근성 기능 사용을 옵트인할 수 있습니다.
UI 자동화에 대한 개요는 UI 자동화 개요참조하세요.
이름 | 가치 |
---|---|
범위 | 주요 |
버전 | 4.7.1 |
타자 | 대상 다시 지정 |
영향을 받는 API
- AutomationElementIdentifiers.LiveSettingProperty
- AutomationElementIdentifiers.LiveRegionChangedEvent
- System.Windows.Automation.AutomationLiveSetting
- AutomationProperties.LiveSettingProperty
- AutomationProperties.SetLiveSetting(DependencyObject, AutomationLiveSetting)
- AutomationProperties.GetLiveSetting(DependencyObject)
- AutomationPeer.GetLiveSettingCore()
Selector SelectionChanged 이벤트와 SelectedValue 속성
세부 정보
.NET Framework 4.7.1부터 Selector는 선택 항목이 변경될 때, SelectionChanged 이벤트를 발생하기 전에 항상 자신의 SelectedValue 속성의 값을 업데이트합니다. 이렇게 하면 SelectedValue 속성이 이벤트를 발생하기 전에 업데이트되는 다른 선택 속성(SelectedItem 및 SelectedIndex)과 일치합니다.
.NET Framework 4.7 및 이전 버전에서 SelectedValue에 대한 업데이트는 대부분의 경우 이벤트 전에 발생했지만 SelectedValue 속성을 변경하여 선택 변경이 발생한 경우 이벤트 후에 발생합니다.
제안
.NET Framework 4.7.1 이상을 대상으로 하는 앱은 이 변경을 옵트아웃하고 애플리케이션 구성 파일의 <runtime>
섹션에 다음을 추가하여 레거시 동작을 사용할 수 있습니다.
<runtime>
<AppContextSwitchOverrides
value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=true" />
</runtime>
.NET Framework 4.7 이하를 대상으로 하지만 .NET Framework 4.7.1 이상에서 실행되는 앱은 애플리케이션 .configuration 파일의 <runtime>
섹션에 다음 줄을 추가하여 새 동작을 사용하도록 설정할 수 있습니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=false" />
</runtime>
이름 | 값 |
---|---|
범위 | 사소한 |
버전 | 4.7.1 |
유형 | 대상 다시 지정 |
영향을 받는 API
TabControl SelectionChanged 이벤트 및 SelectedContent 속성
세부 정보
.NET Framework 4.7.1부터 TabControl 선택 항목이 변경되면 SelectionChanged 이벤트를 발생하기 전에 SelectedContent 속성의 값을 업데이트합니다. .NET Framework 4.7 및 이전 버전에서는 이벤트 후에 SelectedContent 속성에 대한 업데이트가 발생했습니다.
제안
.NET Framework 4.7.1 이상을 대상으로 하는 앱은 이 변경을 옵트아웃하고 애플리케이션 구성 파일의 <runtime>
섹션에 다음을 추가하여 레거시 동작을 사용할 수 있습니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=true" />
</runtime>
.NET Framework 4.7 이하를 대상으로 하지만 .NET Framework 4.7.1 이상에서 실행되는 앱은 애플리케이션 .configuration 파일의 <runtime>
섹션에 다음 줄을 추가하여 새 동작을 사용하도록 설정할 수 있습니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=false" />
</runtime>
이름 | 값 |
---|---|
범위 | 사소한 |
버전 | 4.7.1 |
유형 | 대상 다시 지정 |
영향을 받는 API
WPF PackageDigitalSignatureManager의 기본 해시 알고리즘은 이제 SHA256입니다.
세부 정보
이 System.IO.Packaging.PackageDigitalSignatureManager
WPF 패키지와 관련하여 디지털 서명에 대한 기능을 제공합니다. .NET Framework 4.7 및 이전 버전에서는 패키지의 일부를 서명하는 데 사용되는 기본 알고리즘(PackageDigitalSignatureManager.DefaultHashAlgorithm)이 SHA1이었습니다. SHA1의 최근 보안 문제로 인해 이 기본값은 .NET Framework 4.7.1부터 SHA256으로 변경되었습니다. 이 변경 내용은 XPS 문서를 비롯한 모든 패키지 서명에 영향을 줍니다.
제안
.NET Framework 4.7.1 이하의 프레임워크 버전을 대상으로 하는 동안 이 변경 사항을 활용하려는 개발자 또는 .NET Framework 4.7.1 이상에서 이전 기능이 필요한 개발자는 다음 AppContext 플래그를 적절하게 설정할 수 있습니다. true 값을 지정하면 SHA1이 기본 알고리즘으로 사용되고, false 값을 지정하면 SHA256이 기본 알고리즘으로 사용됩니다.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.MS.Internal.UseSha1AsDefaultHashAlgorithmForDigitalSignatures=true"/>
</runtime>
</configuration>
이름 | 가치 |
---|---|
범위 | 가장자리 |
버전 | 4.7.1 |
유형 | 리타겟팅 |
영향을 받는 API
WF(Windows Workflow Foundation)
WF(Windows Workflow Foundation) 워크플로 디자이너의 접근성 향상
세부 정보
WF(Windows Workflow Foundation) 워크플로 디자이너는 접근성 기술에서 작동하는 방식을 개선하고 있습니다. 이러한 개선 사항에는 다음과 같은 변경 내용이 포함됩니다.
- 탭 순서는 일부 컨트롤에서 왼쪽에서 오른쪽으로, 위에서 아래로 변경됩니다.
- InitializeCorrelation 작업에 대한 상관 관계 데이터를 설정하기 위한 상관 관계 초기화 창
- Receive, Send, SendReply및 ReceiveReply 활동에 대한 콘텐츠 정의 창
- 키보드를 통해 더 많은 함수를 사용할 수 있습니다.
- 활동의 속성을 편집할 때, 포커스가 처음 맞춰지면 키보드로 속성 그룹을 축소할 수 있습니다.
- 이제 키보드로 경고 아이콘에 액세스할 수 있습니다.
- 이제 속성 창의 기타 속성 단추에 키보드로 액세스할 수 있습니다.
- 이제 키보드 사용자는 워크플로 디자이너의 인수 및 변수 창에서 헤더 항목에 액세스할 수 있습니다.
- 포커스가 있는 항목의 가시성이 다음과 같은 상황에서 향상되었습니다.
- 워크플로 디자이너 및 활동 디자이너에서 사용하는 데이터 표에 행 추가
- ReceiveReply 및 SendReply 활동의 필드를 탭하여 이동합니다.
- 변수 또는 인수에 대한 기본값 설정
- 이제 화면 읽기 프로그램이 다음을 올바르게 인식할 수 있습니다.
- 워크플로 디자이너에서 설정된 중단점입니다.
- FlowSwitch<T>, FlowDecision및 CorrelationScope 활동입니다.
- Receive 활동의 내용입니다.
- InvokeMethod 활동의 목표 유형입니다.
- TryCatch 작업의 예외 콤보 상자와 Finally 섹션입니다.
- 메시지 유형 콤보 상자, 상관 관계 이니셜라이저 추가 창의 분할자, 콘텐츠 정의 창 및 메시징 활동의 CorrelatesOn 정의 창(Receive, Send, SendReply및 ReceiveReply)입니다.
- 상태 컴퓨터 전환 및 전환 대상.
- FlowDecision 활동에 대한 주석 및 연결자입니다.
- 활동의 컨텍스트 메뉴(우클릭)입니다.
- 속성 표의 속성 값 편집기, 검색 지우기 단추, 범주별 및 사전순 정렬 단추, 식 편집기 대화 상자.
- 워크플로 디자이너의 확대/축소 백분율입니다.
- Parallel 및 Pick 활동의 구분 기호입니다.
- InvokeDelegate 활동입니다.
- 사전 작업(
Microsoft.Activities.AddToDictionary<TKey,TValue>
,Microsoft.Activities.RemoveFromDictionary<TKey,TValue>
등)에 대한 형식 선택 창입니다. - .NET 유형 찾아보기 및 선택 창
- 워크플로 디자이너의 빵 부스러기 경로입니다.
- 고대비 테마를 선택한 사용자는 워크플로 디자이너의 가시성과 여러 컨트롤 요소의 가시성이 크게 향상된 것을 볼 수 있습니다. 이는 요소 간의 대비 비율 개선과 포커스 요소 주변에 더 눈에 띄게 표시되는 선택 상자 덕분입니다.
제안
다시 호스팅된 워크플로 디자이너가 있는 애플리케이션이 있는 경우 애플리케이션은 다음 작업 중 하나를 수행하여 이러한 변경 내용을 활용할 수 있습니다.
- .NET Framework 4.7.1을 대상으로 애플리케이션을 다시 컴파일합니다. 이러한 접근성 변경은 기본적으로 사용하도록 설정됩니다.
- 애플리케이션이 .NET Framework 4.7 이하를 대상으로 하지만 .NET Framework 4.7.1에서 실행 중인 경우 다음 AppContext 스위치 app.config 파일의
<runtime>
섹션에 추가하고 다음 예제와 같이false
설정하여 이러한 레거시 접근성 동작을 옵트아웃할 수 있습니다.
<?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>
.NET Framework 4.7.1 이상을 대상으로 하고 레거시 접근성 동작을 유지하려는 애플리케이션은 이 AppContext 스위치를 true
명시적으로 설정하여 레거시 접근성 기능 사용을 옵트인할 수 있습니다.
이름 | 값 |
---|---|
범위 | 사소한 |
버전 | 4.7.1 |
유형 | 리타겟팅 |
.NET Framework 4.7.2
핵심
URI에서 유니코드 양방향 제어 문자 허용
세부 정보
유니코드는 텍스트 방향을 지정하는 데 사용되는 몇 가지 특수 컨트롤 문자를 지정합니다. 이전 버전의 .NET Framework에서, 이 문자는 퍼센트 인코딩된 형식으로 존재하더라도 모든 URI에서 잘못 삭제되었습니다. 이제 RFC 3987을 더 잘 따르기 위해 URI에서 이러한 문자를 허용합니다. URI에서 인코딩되지 않은 경우 백분율로 인코딩됩니다. 백분율로 인코딩된 경우 그대로 as-is남아 있습니다.
제안
4.7.2부터 .NET Framework 버전을 대상으로 하는 애플리케이션의 경우 유니코드 양방향 문자에 대한 지원은 기본적으로 사용하도록 설정됩니다. 이 변경이 바람직하지 않은 경우, 애플리케이션 구성 파일의 <runtime>
섹션에 다음 AppContextSwitchOverrides 전환을 추가하여 사용하지 않도록 설정할 수 있습니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Uri.DontKeepUnicodeBidiFormattingCharacters=true" />
</runtime>
이전 버전의 .NET Framework를 대상으로 하지만 .NET Framework 4.7.2부터 버전에서 실행되는 애플리케이션의 경우 유니코드 양방향 문자에 대한 지원은 기본적으로 사용하지 않도록 설정됩니다. 다음 AppContextSwitchOverrides 스위치를 애플리케이션 구성 파일의 <runtime>
섹션에 추가하여 활성화할 수 있습니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Uri.DontKeepUnicodeBidiFormattingCharacters=false" />
</runtime>
이름 | 값 |
---|---|
범위 | 사소한 |
버전 | 4.7.2 |
유형 | 대상 다시 지정 |
영향을 받는 API
DeflateStream은 압축 해제에 네이티브 API를 사용합니다.
세부 정보
.NET Framework 4.7.2부터 T:System.IO.Compression.DeflateStream
클래스의 압축 해제 구현이 기본적으로 네이티브 Windows API를 사용하도록 변경되었습니다. 일반적으로 이로 인해 성능이 크게 향상됩니다. .NET Framework 버전 4.7.2 이상을 대상으로 하는 모든 .NET 애플리케이션은 네이티브 구현을 사용합니다. 이 변경으로 인해 다음과 같은 동작에 몇 가지 차이가 발생할 수 있습니다.
- 예외 메시지는 다를 수 있습니다. 그러나 발생한 예외의 유형은 동일하게 유지됩니다.
- 작업을 완료하기에 충분한 메모리가 없는 것과 같은 일부 특수 상황은 다르게 처리될 수 있습니다.
- gzip 헤더 구문 분석에 알려진 차이점이 있습니다(참고: 압축 해제 시 설정된
GZipStream
만 영향을 받습니다). - 잘못된 헤더를 구문 분석할 때 발생하는 예외는 다양한 시점에서 발생할 수 있습니다.
- 네이티브 구현은 gzip 헤더 내의 일부 예약된 플래그(예: FLG)의 값이 사양에 따라 설정되도록 강제하여, 이전에 잘못된 값이 무시되었던 곳에서 예외가 발생할 수 있습니다.
제안
네이티브 API를 사용하는 압축 해제가 앱의 동작에 부정적인 영향을 주는 경우 Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression
스위치를 app.config 파일의 runtime
섹션에 추가하고 true
설정하여 이 기능을 옵트아웃할 수 있습니다.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression=true" />
</runtime>
</configuration>
이름 | 값 |
---|---|
범위 | 사소한 |
버전 | 4.7.2 |
유형 | 대상 다시 지정 |
영향을 받는 API
System.Uri가 일관된 예약 문자 집합을 사용하는지 확인
세부 정보
System.Uri에서 간혹 디코딩되던 특정 퍼센트 인코딩된 문자는 이제 일관되게 인코딩된 상태로 유지됩니다. 이는 URI의 경로, 쿼리, 조각 또는 userinfo 구성 요소에 액세스하는 속성 및 메서드에서 발생합니다. 동작은 다음 둘 다 true인 경우에만 변경됩니다.
- URI에는 다음의 예약된 문자인
:
,'
,(
,)
,!
또는*
가 인코딩된 형식으로 포함되어 있습니다. - URI에는 유니코드 또는 인코딩된 예약되지 않은 문자가 포함됩니다. 위의 두 가지 조건이 모두 true이면, 인코딩된 예약 문자는 그대로 인코딩된 상태로 남습니다. 이전 버전의 .NET Framework에서는 디코딩됩니다.
제안
4.7.2부터 .NET Framework 버전을 대상으로 하는 애플리케이션의 경우 기본적으로 새 디코딩 동작이 사용하도록 설정됩니다. 이 변경이 바람직하지 않은 경우, <runtime>
섹션의 애플리케이션 구성 파일에 다음과 같이 AppContextSwitchOverrides 스위치를 추가하여 비활성화할 수 있습니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Uri.DontEnableStrictRFC3986ReservedCharacterSets=true" />
</runtime>
이전 버전의 .NET Framework를 대상으로 하지만 .NET Framework 4.7.2부터 버전에서 실행되는 애플리케이션의 경우 새 디코딩 동작은 기본적으로 사용하지 않도록 설정됩니다. 다음 AppContextSwitchOverrides 스위치를 응용 프로그램 구성 파일의 <runtime>
섹션에 추가하면 활성화할 수 있습니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Uri.DontEnableStrictRFC3986ReservedCharacterSets=false" />
</runtime>
이름 | 값 |
---|---|
범위 | 사소한 |
버전 | 4.7.2 |
유형 | 리타겟팅 |
영향을 받는 API
Resgen이 웹에서 콘텐츠 로드를 거부합니다.
세부 정보
.resx 파일에는 이진 형식 입력이 포함될 수 있습니다. resgen을 사용하여 신뢰할 수 없는 위치에서 다운로드한 파일을 로드하려고 하면 기본적으로 입력을 로드하지 못합니다.
제안
신뢰할 수 없는 위치에서 이진 형식의 입력을 로드해야 하는 Resgen 사용자는 입력 파일에서 웹의 표시를 제거하거나 옵트아웃 단점을 적용할 수 있습니다. 컴퓨터 전체 옵트아웃 단점을 적용하려면 다음 레지스트리 설정을 추가합니다. [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\SDK] "AllowProcessOfUntrustedResourceFiles"="true"
이름 | 값 |
---|---|
범위 | 가장자리 |
버전 | 4.7.2 |
종류 | 대상 다시 지정 |
이식 가능한 PDB를 사용할 때 가져온 스택 추적에는 이제 요청된 경우 원본 파일 및 줄 정보가 포함됩니다.
세부 정보
.NET Framework 4.7.2부터 이식 가능한 PDB를 사용할 때 가져온 스택 추적에는 요청 시 원본 파일 및 줄 정보가 포함됩니다. .NET Framework 4.7.2 이전 버전에서는 명시적으로 요청된 경우에도 이식 가능한 PDB를 사용할 때 원본 파일 및 줄 정보를 사용할 수 없습니다.
제안
.NET Framework 4.7.2를 대상으로 하는 애플리케이션의 경우, 이식 가능한 PDB를 사용할 때 원본 파일 및 줄 정보가 필요하지 않은 경우에 옵트아웃하려면 app.config
파일의 <runtime>
섹션에 다음을 추가하세요.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Diagnostics.IgnorePortablePDBsInStackTraces=true" />
</runtime>
이전 버전의 .NET Framework를 대상으로 하지만 .NET Framework 4.7.2 이상에서 실행되는 애플리케이션의 경우, app.config
파일의 <runtime>
섹션에 다음을 추가하여 이식 가능한 PDB를 사용할 때 원본 파일 및 줄 정보를 활성화할 수 있습니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Diagnostics.IgnorePortablePDBsInStackTraces=false" />
</runtime>
이름 | 값 |
---|---|
범위 | 가장자리 |
버전 | 4.7.2 |
유형 | 대상 다시 지정 |
영향을 받는 API
Windows Forms
.NET 4.7.2용 Windows Forms 컨트롤의 접근성 향상
세부 정보
Windows Forms 프레임워크는 Windows Forms 고객을 더 잘 지원하기 위해 접근성 기술과 함께 작동하는 방식을 개선하고 있습니다. 여기에는 다음과 같은 변경 내용이 포함되었습니다.
- 고대비 모드에서 디스플레이를 개선하기 위한 변경 내용입니다.
- DataGridView 및 MenuStrip 컨트롤에서 키보드 탐색을 개선하기 위해 변경합니다.
- 내레이터와의 상호 작용에 대한 변경 내용입니다.
제안
이러한 변경 내용을 옵트인하거나 옵트아웃하는 방법 애플리케이션이 이러한 변경 내용을 활용하려면 .NET Framework 4.7.2 이상에서 실행해야 합니다. 애플리케이션은 다음 방법 중 하나에서 이러한 변경 내용을 활용할 수 있습니다.
- .NET Framework 4.7.2를 대상으로 다시 컴파일됩니다. 이러한 접근성 변경은 .NET Framework 4.7.2 이상을 대상으로 하는 Windows Forms 애플리케이션에서 기본적으로 사용하도록 설정됩니다.
- 다음 예제와 같이 .NET Framework 4.7.1 또는 그 이전 버전을 대상으로 하며, 레거시 접근성 동작을 옵트아웃하기 위해 앱 구성 파일의
<runtime>
섹션에 다음 AppContext Switch을 추가하고,false
으로 설정합니다.
<?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>
.NET Framework 4.7.2에 추가된 접근성 기능을 옵트인하려면 .NET Framework 4.7.1의 접근성 기능도 옵트인해야 합니다. .NET Framework 4.7.2 이상을 대상으로 하고 레거시 접근성 동작을 유지하려는 애플리케이션은 이 AppContext 스위치를 true
명시적으로 설정하여 레거시 접근성 기능 사용을 옵트인할 수 있습니다.
고대비 테마에서 운영 체제(OS) 정의 색상 사용
- 이제 ToolStripDropDownButton 드롭다운 화살표는 고대비 테마에서 운영 체제에서 정의한 색상을 사용합니다.
- Button, RadioButton 및 CheckBox 컨트롤이 FlatStyle이 FlatStyle.Flat 또는 FlatStyle.Popup로 설정되고 선택된 경우, 이제 고대비 테마에서 OS 정의 색상을 사용합니다. 이전에는 텍스트와 배경색이 대조되지 않아 읽기가 어려웠습니다.
-
GroupBox에 포함된 Enabled 속성이
false
로 설정된 컨트롤은 이제 고대비 테마에서 OS가 정의한 색상을 사용합니다. - ToolStripButton, ToolStripComboBox및 ToolStripDropDownButton 컨트롤은 고대비 모드에서 명도 대비 비율이 증가합니다.
- DataGridViewLinkCell 기본적으로 DataGridViewLinkCell.LinkColor 속성에 대해 고대비 모드에서 OS 정의 색을 사용합니다. 참고: Windows 10에서는 일부 고대비 시스템 색의 값이 변경되었습니다. Windows Forms 프레임워크는 Win32 프레임워크를 기반으로 합니다. 최적의 사용자 경험을 위해, 최신 버전의 Windows에서 실행하고, 테스트 애플리케이션에 app.manifest 파일을 추가한 다음, 아래의 코드를 주석을 제거하여 최신 OS 변경 내용을 적용합니다.
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
향상된 내레이터 지원
- 이제 내레이터는 ToolStripMenuItem텍스트를 발표할 때 ToolStripMenuItem.ShortcutKeys 속성의 값을 알립니다.
- 이제 내레이터는 ToolStripMenuItem의 Enabled 속성이
false
로 설정된 경우를 나타냅니다. - 이제 내레이터는 ListView.CheckBoxes 속성이
true
로 설정되면 체크 박스의 상태에 대한 피드백을 제공합니다. - 이제 내레이터 스캔 모드 포커스 순서가 ClickOnce 다운로드 대화 상자 창에서 컨트롤의 시각적 순서와 일치합니다.
향상된 DataGridView 접근성 지원
- 이제 키보드를 사용하여 DataGridView 행을 정렬할 수 있습니다. 이제 사용자는 F3 키를 사용하여 현재 열을 기준으로 정렬할 수 있습니다.
- DataGridView.SelectionMode가 DataGridViewSelectionMode.FullRowSelect로 설정되면, 사용자가 현재 행의 셀들을 탭할 때 현재 열을 표시하기 위해 열 머리글의 색상이 변경됩니다.
- 이제 DataGridViewCell.DataGridViewCellAccessibleObject.Parent 속성이 올바른 부모 컨트롤을 반환합니다.
향상된 시각적 신호
- 빈 Text 속성이 있는 RadioButton 및 CheckBox 컨트롤이 포커스를 받으면, 포커스 표시기가 나타납니다.
향상된 속성 그리드 지원
이제 PropertyGrid 컨트롤 자식 요소는 PropertyGrid 요소가 활성화된 경우에만 IsReadOnlyProperty 속성에 대해
true
을 반환합니다.PropertyGrid 컨트롤 자식 요소는 이제 사용자가 PropertyGrid 요소를 변경할 수 있을 때만 IsEnabledProperty 속성에 대해
향상된 키보드 탐색false
을 반환합니다. UI 자동화에 대한 개요는 UI 자동화 개요참조하세요.이제 ToolStripPanel의 TabStop 속성에
true
이(가) 설정된 경우 ToolStripButton에 포커스를 맞출 수 있습니다.
이름 | 값 |
---|---|
범위 | 전공 |
버전 | 4.7.2 |
유형 | 대상 다시 지정 |
ContextMenuStrip.SourceControl 속성은 중첩된 ToolStripMenuItems의 경우 유효한 컨트롤을 포함합니다.
세부 정보
.NET Framework 4.7.1 및 이전 버전에서 ContextMenuStrip.SourceControl 속성은 사용자가 중첩된 ToolStripMenuItem 컨트롤에서 메뉴를 열 때 null을 잘못 반환합니다. .NET Framework 4.7.2 이상에서는 SourceControl 속성이 항상 실제 소스 제어로 설정됩니다.
제안
이러한 변경 내용을 옵트인하거나 옵트아웃하는 방법 애플리케이션이 이러한 변경 내용을 활용하려면 .NET Framework 4.7.2 이상에서 실행해야 합니다. 애플리케이션은 다음 방법 중 하나에서 이러한 변경 내용을 활용할 수 있습니다.
- .NET Framework 4.7.2를 대상으로 합니다. 이 변경은 .NET Framework 4.7.2 이상을 대상으로 하는 Windows Forms 애플리케이션에서 기본적으로 사용하도록 설정됩니다.
- .NET Framework 4.7.1 또는 이전 버전을 대상으로 하며, 다음 예제와 같이 레거시 접근성 동작을 사용하지 않도록 app.config 파일의
<runtime>
섹션에 AppContext Switch를 추가하고 이를false
로 설정합니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue=false"/>
</runtime>
.NET Framework 4.7.2 이상을 대상으로 하고 레거시 동작을 유지하려는 애플리케이션은 이 AppContext 스위치를 true
명시적으로 설정하여 레거시 소스 제어 값 사용을 옵트인할 수 있습니다.
이름 | 값 |
---|---|
범위 | 가장자리 |
버전 | 4.7.2 |
유형 | 대상 다시 지정 |
영향을 받는 API
PrivateFontCollection.AddFontFile 메서드가 글꼴 리소스를 해제합니다.
세부 정보
.NET Framework 4.7.1 및 이전 버전에서는 System.Drawing.Text.PrivateFontCollection 클래스가 AddFontFile(String) 메서드를 사용하여 이 컬렉션에 추가된 Font 객체에 대해 PrivateFontCollection이 해제된 후 GDI+ 글꼴 리소스를 해제하지 않습니다. .NET Framework 4.7.2 이상 및 이후의 Dispose 릴리스에서는 파일로 컬렉션에 추가된 GDI+ 글꼴을 제공합니다.
제안
이러한 변경 내용을 옵트인하거나 옵트아웃하는 방법 애플리케이션이 이러한 변경 내용을 활용하려면 .NET Framework 4.7.2 이상에서 실행해야 합니다. 애플리케이션은 다음 방법 중 하나에서 이러한 변경 내용을 활용할 수 있습니다.
- .NET Framework 4.7.2를 대상으로 다시 컴파일됩니다. 이 변경은 .NET Framework 4.7.2 이상을 대상으로 하는 Windows Forms 애플리케이션에서 기본적으로 사용하도록 설정됩니다.
- .NET Framework 4.7.1 또는 이전 버전을 대상으로 하며, 다음과 같이 레거시 접근성 동작을 비활성화하려면 다음 AppContext Switch을 app.config 파일의
<runtime>
섹션에 추가하고,false
로 설정합니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Drawing.Text.DoNotRemoveGdiFontsResourcesFromFontCollection=false"/>
</runtime>
.NET Framework 4.7.2 이상을 대상으로 하고 레거시 동작을 유지하려는 애플리케이션은 이 AppContext 스위치를 true
명시적으로 설정하여 글꼴 리소스를 해제하지 않도록 옵트인할 수 있습니다.
이름 | 값 / 가치 |
---|---|
범위 | 가장자리 |
버전 | 4.7.2 |
유형 | 리타겟팅 |
영향을 받는 API
WinForm의 도메인 업버튼 및 다운버튼 작업이 지금 동기화 중입니다.
세부 정보
.NET Framework 4.7.1 및 이전 버전에서는 컨트롤 텍스트가 있을 때 DomainUpDown 컨트롤의 DomainUpDown.UpButton() 동작이 무시되고 개발자는 DomainUpDown.UpButton() 작업을 사용하기 전에 컨트롤에서 DomainUpDown.DownButton() 작업을 사용해야 합니다. .NET Framework 4.7.2부터 DomainUpDown.UpButton() 및 DomainUpDown.DownButton() 작업은 이 시나리오에서 독립적으로 작동하며 동기화 상태를 유지합니다.
제안
애플리케이션이 이러한 변경 내용을 활용하려면 .NET Framework 4.7.2 이상에서 실행해야 합니다. 애플리케이션은 다음 방법 중 하나에서 이러한 변경 내용을 활용할 수 있습니다.
- .NET Framework 4.7.2를 대상으로 다시 컴파일됩니다. 이 변경은 .NET Framework 4.7.2 이상을 대상으로 하는 Windows Forms 애플리케이션에서 기본적으로 사용하도록 설정됩니다.
- 앱 구성 파일의
<runtime>
섹션에 다음 AppContext Switch을 추가하고false
으로 설정하여, 다음 예제와 같이 레거시 스크롤 동작을 사용하지 않도록 합니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling=false"/>
</runtime>
이름 | 값 |
---|---|
범위 | 엣지 |
버전 | 4.7.2 |
유형 | 대상 다시 지정 |
영향을 받는 API
WPF(Windows Presentation Foundation)
이제 키보드 포커스가 다중 계층의 WinForms/WPF 호스팅에서 올바르게 이동됩니다.
세부 정보
WinForms 컨트롤을 호스팅하고 그 안에 WPF 컨트롤을 포함하는 WPF 애플리케이션을 고려합니다. 해당 계층의 첫 번째 또는 마지막 컨트롤이 WPF System.Windows.Forms.Integration.ElementHost
경우 사용자는 WinForms 계층에서 탭아웃할 수 없습니다. 이 변경으로 이 문제가 해결되고, 사용자는 이제 WinForms 계층 밖으로 벗어날 수 있습니다. 포커스가 WinForms 계층을 벗어나지 않도록 의존하는 자동화된 애플리케이션은 더 이상 예상대로 작동하지 않을 수 있습니다.
제안
.NET 4.7.2 미만의 프레임워크 버전을 대상으로 하면서 이 변화를 활용하고자 하는 개발자는 변경을 활성화하기 위해 다음의 AppContext 플래그 집합을 false로 설정할 수 있습니다.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false"/>
</runtime>
</configuration>
WPF 애플리케이션은 이후의 개선 사항을 적용하려면 모든 초기 접근성 개선 사항을 활성화해야 합니다. 즉, Switch.UseLegacyAccessibilityFeatures
스위치와 Switch.UseLegacyAccessibilityFeatures.2
스위치를 모두 설정해야 하며, .NET 4.7.2 이상을 대상으로 지정하는 동안 이전 기능이 필요한 개발자는 변경 사항을 비활성화하려면 다음의 AppContext 플래그를 true로 설정할 수 있습니다.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures.2=true"/>
</runtime>
</configuration>
이름 | 값 |
---|---|
범위 | 엣지 |
버전 | 4.7.2 |
유형 | 리타겟팅 |
WPF의 태그 컴파일러에 대한 기본 해시 알고리즘은 이제 SHA256입니다.
세부 정보
WPF MarkupCompiler는 XAML 태그 파일에 대한 컴파일 서비스를 제공합니다. .NET Framework 4.7.1 이전 버전에서는 체크섬에 사용되는 기본 해시 알고리즘이 SHA1입니다. SHA1의 최근 보안 문제로 인해 이 기본값은 .NET Framework 4.7.2부터 SHA256으로 변경되었습니다. 이 변경 내용은 컴파일 중에 태그 파일에 대한 모든 체크섬 생성에 영향을 줍니다.
제안
.NET Framework 4.7.2 이상 또는 상위 버전을 대상으로 하고 SHA1 해시 동작으로 되돌리려는 개발자는 다음과 같은 AppContext 플래그를 설정해야 합니다.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Markup.DoNotUseSha256ForMarkupCompilerChecksumAlgorithm=true"/>
</runtime>
</configuration>
.NET 4.7.2 미만의 프레임워크 버전을 대상으로 하는 동안 SHA256 해시를 사용하려는 개발자는 아래 AppContext 플래그를 설정해야 합니다. 설치된 .NET Framework 버전은 4.7.2 이상이어야 합니다.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Markup.DoNotUseSha256ForMarkupCompilerChecksumAlgorithm=false"/>
</runtime>
</configuration>
이름 | 가치 |
---|---|
범위 | 투명한 |
버전 | 4.7.2 |
유형 | 리타겟팅 |
WPF AppDomain 종료 처리 과정에서 이제 약한 이벤트를 정리할 때 디스패처.Invoke를 호출할 수 있습니다.
세부 정보
.NET Framework 4.7.1 및 그 이전 버전에서는 AppDomain 종료 시 .NET 종료자 스레드에서 WPF가 가끔 System.Windows.Threading.Dispatcher을(를) 만들 수 있습니다. 이 문제는 약한 이벤트의 정리를 스레드가 인식하도록 하여 .NET Framework 4.7.2 이상 버전에서 해결되었습니다. 이로 인해 WPF는 Dispatcher.Invoke 호출하여 정리 프로세스를 완료할 수 있습니다. 특정 애플리케이션에서 종료자 타이밍이 변경되면 AppDomain 또는 프로세스 종료 중에 예외가 발생할 수 있습니다. 이는 일반적으로 처리 또는 AppDomain 종료 전에 작업자 스레드에서 실행되는 디스패처를 올바르게 종료하지 않는 애플리케이션에서 볼 수 있습니다. 이러한 애플리케이션은 디스패처의 수명을 제대로 관리하기 위해 주의해야 합니다.
제안
.NET Framework 4.7.2 이상 버전에서 개발자는 정리 변경으로 인해 발생할 수 있는 타이밍 문제를 완화(제거하지 않음)하기 위해 이 수정을 사용하지 않도록 설정할 수 있습니다. 정리에서 변경을 사용하지 않도록 설정하려면 다음 AppContext 플래그를 사용합니다.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.MS.Internal.DoNotInvokeInWeakEventTableShutdownListener=true"/>
</runtime>
</configuration>
이름 | 가치 |
---|---|
범위 | 엣지 |
버전 | 4.7.2 |
유형 | 리타겟팅 |
WPF 마스터/세부 정보 시나리오에서 ADO 데이터를 표시하는 경우 기본 키 변경
세부 정보
당신에게 Order
형식의 항목을 포함하는 ADO 컬렉션이 있다고 가정해 봅시다. 이 컬렉션은 기본 키 "OrderID"를 통해 Detail
형식의 항목 컬렉션과 "OrderDetails"라는 관계로 연결되어 있습니다. WPF 앱에서 지정된 순서에 대한 세부 정보에 목록 컨트롤을 바인딩할 수 있습니다.
<ListBox ItemsSource="{Binding Path=OrderDetails}" >
여기에서 DataContext는 Order
입니다. WPF는 OrderID
마스터 항목의 OrderID
일치하는 모든 Detail
항목의 컬렉션 D인 OrderDetails
속성의 값을 가져옵니다. 동작 변경은 마스터 항목의 기본 키 OrderID
변경할 때 발생합니다. ADO는 Details 컬렉션에서 영향을 받는 각 레코드의 OrderID
를 자동으로 변경합니다. 즉, 컬렉션 D로 복사된 레코드들입니다. 하지만 D는 어떻게 되나요?
- 이전 동작: 컬렉션 D가 지워집니다. 마스터 항목은 속성
대한 변경 알림을 않습니다. ListBox는 이제 비어 있는 컬렉션 D를 계속 사용합니다. - 새 동작: 컬렉션 D는 변경되지 않습니다. 각 항목은
OrderID
속성에 대한 변경 알림을 생성합니다. ListBox는 컬렉션 D를 계속 사용하고, 새OrderID
과 함께 세부 정보를 표시합니다. WPF는followParent
인수가true
설정된 ADO 메서드 DataRowView.CreateChildView(DataRelation, Boolean) 호출하여 다른 방식으로 컬렉션 D를 만들어 새 동작을 구현합니다.
제안
앱은 다음 AppContext 스위치를 사용하여 새 동작을 가져옵니다.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Data.DoNotUseFollowParentWhenBindingToADODataRelation=false"/>
</runtime>
</configuration>
스위치는 기본적으로 .NET 4.7.1 이하를 대상으로 하는 앱의 true
(이전 동작) 및 .NET 4.7.2 이상을 대상으로 하는 앱의 false
(새 동작)로 설정됩니다.
이름 | 값 |
---|---|
범위 | 사소한 |
버전 | 4.7.2 |
타입 | 리타겟팅 |
컨트롤에 콘텐츠가 없을 때 RadioButton 및 CheckBox용 WPF FocusVisual이 올바르게 표시됩니다.
세부 정보
.NET Framework 4.7.1 및 이전 버전의 WPF System.Windows.Controls.CheckBox 및 System.Windows.Controls.RadioButton은 일관성이 없고, 클래식 및 고대비 테마에서는 포커스 시각적 요소가 잘못되어 있습니다. 이러한 문제는 컨트롤에 콘텐츠 집합이 없는 경우에 발생합니다. 이렇게 하면 테마 간 전환이 혼동되고 포커스 시각적 개체가 보기 어려울 수 있습니다. .NET Framework 4.7.2에서 이러한 시각적 효과들은 이제 테마들 간에 더 일관성이 있어졌으며, 클래식 및 고대비 테마에서 더 쉽게 확인할 수 있습니다.
제안
.NET 4.7.1의 동작으로 되돌리려는 .NET Framework 4.7.2를 대상으로 하는 개발자는 다음 AppContext 플래그를 설정해야 합니다.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures.2=true;"/>
</runtime>
</configuration>
.NET 4.7.2 아래의 프레임워크 버전을 대상으로 하는 동안 이 변경 사항을 활용하려는 개발자는 다음 AppContext 플래그를 설정해야 합니다. 모든 플래그를 적절하게 설정해야 하며 설치된 .NET Framework 버전은 4.7.2 이상이어야 합니다. WPF 애플리케이션은 최신 개선 사항을 얻기 위해 이전의 모든 접근성 향상을 옵트인해야 합니다. 이렇게 하려면 AppContext 스위치 'Switch.UseLegacyAccessibilityFeatures'와 'Switch.UseLegacyAccessibilityFeatures.2'가 모두 false로 설정되어 있는지 확인합니다.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false;"/>
</runtime>
</configuration>
이름 | 값 |
---|---|
범위 | 가장자리 |
버전 | 4.7.2 |
유형 | 대상 다시 지정 |
WPF TextBox/PasswordBox 텍스트 선택이 시스템 색을 따르지 않음
세부 정보
.NET Framework 4.7.1 이전 버전에서는 WPF System.Windows.Controls.TextBox
및 System.Windows.Controls.PasswordBox
이 장식자 계층에서만 텍스트 선택을 렌더링할 수 있었습니다. 일부 시스템 테마에서는 텍스트가 차단되어 읽기가 어렵습니다. .NET Framework 4.7.2 이상에서 개발자는 이 문제를 해결하는 표시기 비기반 선택 렌더링 방식을 사용하도록 설정할 수 있습니다.
제안
이 변경 사항을 활용하려는 개발자는 다음 AppContext 플래그를 적절하게 설정해야 합니다. 이 기능을 활용하려면 설치된 .NET Framework 버전이 4.7.2 이상이어야 합니다. 비 어도너 기반 선택을 사용하도록 설정하려면 다음 AppContext 플래그를 사용합니다.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.Text.UseAdornerForTextboxSelectionRendering=false"/>
</runtime>
</configuration>
이름 | 값 |
---|---|
범위 | 엣지 |
버전 | 4.7.2 |
유형 | 리타겟팅 |
WF(Windows Workflow Foundation)
IWorkflowInstanceManagement.TransactedCancel 및 IWorkflowInstanceManagement.TransactedTerminate에 대한 무한 재귀 방지
세부 정보
IWorkflowInstanceManagement.TransactedCancel 또는 IWorkflowInstanceManagement.TransactedTerminate API를 사용하여 워크플로 서비스 인스턴스를 취소하거나 종료하는 경우 Workflow
런타임이 요청 처리의 일부로 서비스 인스턴스를 유지하려고 할 때 무한 재귀로 인해 워크플로 인스턴스가 스택 오버플로를 발생시킬 수 있습니다. 워크플로 인스턴스가 다른 서비스에 대한 다른 미해결 WCF 요청이 완료되기를 기다리는 상태에 있으면 문제가 발생합니다.
TransactedCancel
및 TransactedTerminate
작업은 워크플로 서비스 인스턴스에 대해 대기 중인 작업 항목을 만듭니다. 이러한 작업 항목은 TransactedCancel/TransactedTerminate
요청 처리의 일부로 실행되지 않습니다. 워크플로 서비스 인스턴스가 다른 미해결 WCF 요청이 완료될 때까지 대기 중이므로 생성된 작업 항목은 대기 상태로 유지됩니다.
TransactedCancel/TransactedTerminate
작업이 완료되고 컨트롤이 클라이언트로 다시 반환됩니다.
TransactedCancel/TransactedTerminate
작업과 연결된 트랜잭션이 커밋을 시도하는 경우 워크플로 서비스 인스턴스 상태를 유지해야 합니다. 그러나 인스턴스에 대한 미해결 WCF
요청이 있으므로 워크플로 런타임은 워크플로 서비스 인스턴스를 유지할 수 없으며 무한 재귀 루프는 스택 오버플로로 이어집니다. TransactedCancel
및 TransactedTerminate
메모리에 작업 항목만 만들기 때문에 트랜잭션이 존재한다는 사실은 아무런 영향을 미치지 않습니다. 트랜잭션 롤백은 작업 항목을 삭제하지 않습니다. 이 문제를 해결하기 위해, .NET Framework 4.7.2부터 워크플로 서비스의 web.config/app.config
에 추가하여 TransactedCancel
및 TransactedTerminate
에 대한 트랜잭션을 무시하도록 지시하는 AppSetting
이 도입되었습니다. 이렇게 하면 워크플로 인스턴스가 지속될 때까지 기다리지 않고 트랜잭션을 커밋할 수 있습니다. 이 기능에 대한 AppSetting의 이름은 microsoft:WorkflowServices:IgnoreTransactionsForTransactedCancelAndTransactedTerminate
.
true
값은 트랜잭션을 무시하여 스택 오버플로를 방지해야 임을 나타냅니다. 이 AppSetting의 기본값은 false
기존 워크플로 서비스 인스턴스는 영향을 받지 않습니다.
제안
AppFabric 또는 다른 IWorkflowInstanceManagement 클라이언트를 사용하고 워크플로 인스턴스를 취소하거나 종료하려고 할 때 워크플로 서비스 인스턴스에서 스택 오버플로가 발생하는 경우 워크플로 서비스에 대한 web.config/app.config 파일의 <appSettings>
섹션에 다음을 추가할 수 있습니다.
<add key="microsoft:WorkflowServices:IgnoreTransactionsForTransactedCancelAndTransactedTerminate" value="true"/>
문제가 발생하지 않는 경우 이 작업을 수행할 필요가 없습니다.
이름 | 값 |
---|---|
범위 | 가장자리 |
버전 | 4.7.2 |
유형 | 대상 다시 지정 |
.NET