.NET Framework 4.7.x로의 마이그레이션을 위한 대상 다시 지정 변경 내용

이 문서에는 .NET Framework 4.7, 4.7.14.7.2에서 발생한 앱 호환성 문제가 나열되어 있습니다.

.NET Framework 4.7

ASP.NET

HttpRuntime.AppDomainAppPath가 NullReferenceException을 Throw함

세부 정보

.NET Framework 4.6.2에서 런타임은 null 문자를 포함하는 P:System.Web.HttpRuntime.AppDomainAppPath 값을 검색할 때 T:System.NullReferenceException를 throw합니다. .NET Framework 4.6.1 이전 버전에서 런타임은 T:System.ArgumentNullException를 throw합니다.

제안 해결 방법

이러한 변경에 대처하기 위해 다음 중 하나를 수행할 수 있습니다.

  • 애플리케이션이 .NET Framework 4.6.2에서 실행 중인 경우 T:System.NullReferenceException를 처리합니다.
  • .NET Framework 4.7로 업그레이드하면 이전 동작이 복원되고 T:System.ArgumentNullException가 throw됩니다.
이름
Scope Microsoft Edge
버전 4.6.2
형식 대상 변경

영향을 받는 API

세션당 동시 요청 수 조절

설명

.NET Framework 4.6.2 이전 버전에서 ASP.NET은 같은 Sessionid를 사용하여 요청을 순차적으로 실행하고, ASP.NET은 항상 기본적으로 쿠키를 통해 Sessionid를 발급합니다. 페이지가 응답하는 데 시간이 오래 걸릴 때 브라우저에서 F5 키를 누르면 서버 성능이 크게 저하됩니다. 수정 사항에서는 카운터를 추가하여 큐에 대기 중인 요청을 추적하고 지정된 한도를 초과할 때 요청을 종료합니다. 기본값은 50입니다. 이 한도에 도달하면 이벤트 로그에 경고가 기록되고 HTTP 500 응답이 IIS 로그에 기록될 수 있습니다.

제안 해결 방법

이전 동작을 복원하려면 web.config 파일에 다음 설정을 추가하여 새 동작을 옵트아웃(opt out)할 수 있습니다.

<appSettings>
    <add key="aspnet:RequestQueueLimitPerSession" value="2147483647"/>
</appSettings>
이름
Scope Microsoft Edge
버전 4.7
형식 대상 변경

네트워킹

ServicePointManager.SecurityProtocol의 기본값은 SecurityProtocolType.System.Default임

설명

.NET Framework 4.7을 대상으로 하는 앱부터 ServicePointManager.SecurityProtocol 속성의 기본값은 SecurityProtocolType.SystemDefault됩니다. 이 변경으로 SslStream을 기반으로 하는 .NET Framework 네트워킹 API(예: FTP, HTTPS 및 SMTP)가 .NET Framework에서 정의한 하드 코드된 값을 사용하는 대신 운영 체제에서 기본 보안 프로토콜을 상속할 수 있습니다. 기본값은 운영 체제 및 시스템 관리자가 수행하는 사용자 정의 구성에 따라 다릅니다. 각 버전의 Windows 운영 체제에서 기본 SChannel 프로토콜에 대한 자세한 내용은 TLS/SSL의 프로토콜(Schannel SSP)을 참조하세요.

이전 버전의 .NET Framework를 대상으로 하는 애플리케이션의 경우 ServicePointManager.SecurityProtocol 속성의 기본값은 대상으로 하는 .NET Framework의 버전에 따라 달라집니다. 자세한 내용은 .NET Framework 4.5.2에서 4.6으로 마이그레이션을 위해 대상 변경의 네트워킹 섹션을 참조하세요.

제안 해결 방법

이 변경은 .NET Framework 4.7 이상 버전을 대상으로 하는 애플리케이션에 영향을 줍니다. 시스템 기본값에 의존하는 대신 정의된 프로토콜을 사용하려는 경우 ServicePointManager.SecurityProtocol 속성의 값을 명시적으로 설정할 수 있습니다. 이 변경을 원치 않을 경우 애플리케이션 구성 파일의 <runtime> 섹션에 구성 설정을 추가하여 옵트아웃할 수 있습니다. 다음 예제에서는 <runtime> 섹션 및 Switch.System.Net.DontEnableSystemDefaultTlsVersions 옵트아웃 스위치를 모두 보여줍니다.

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=true" />
</runtime>
이름
Scope
버전 4.7
형식 대상 변경

영향을 받는 API

SslStream이 TLS 경고를 지원

설명

TLS 핸드셰이크가 실패하면 첫 번째 I/O 읽기/쓰기 작업에 의해 내부 System.ComponentModel.Win32Exception 예외가 있는 System.IO.IOException이 throw됩니다. System.ComponentModel.Win32ExceptionSystem.ComponentModel.Win32Exception.NativeErrorCode 코드는 TLS 및 SSL 경고에 대한 Schannel 오류 코드를 사용하여 원격 주체에서 TLS 경고로 매핑될 수 있습니다. 자세한 내용은 RFC 2246: 섹션 7.2.2 오류 경고를 참조하세요.
.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 이상 시스템에서 실행되는 .NET Framework 4.0에서 4.6.2까지 버전을 대상으로 하는 애플리케이션은 호환성을 유지하기 위해 사용하지 못하도록 설정하는 기능이 있습니다.
.NET Framework 4.7 이상에서 실행되는 .NET Framework 4.6 및 이상 애플리케이션에 대한 기능을 사용하거나 사용하지 못하도록 설정하려면 다음 구성 API를 사용할수 있습니다.

  • 프로그래밍 방식으로: 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>
    
  • 레지스트리 키(전역 컴퓨터): 값을 false로 설정하여 .NET Framework 4.6 - 4.6.2의 기능을 사용합니다.

    Key: HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext\Switch.System.Net.DontEnableTlsAlerts
    - Type: String
    - Value: "true"
    
속성
Scope Microsoft Edge
버전 4.7
형식 대상 변경

영향을 받는 API

보안

이제 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.DoNotAddrOfCspParentWindowHandletrue로 설정하여 동작 변경을 옵트아웃할 수 있습니다.

  • 여기에 설명된 대로 AppContext에서 compat 스위치를 프로그래밍 방식으로 설정합니다.
  • 다음 줄을 app.config 파일의 <runtime> 섹션에 추가
<runtime>
 <AppContextSwitchOverrides value="Switch.System.Security.Cryptography.DoNotAddrOfCspParentWindowHandle=true"/>
</runtime>

반대로 이전 버전의 .NET Framework에서 애플리케이션이 로드될 때 .NET Framework 4.7 런타임에서 새로운 동작을 옵트인하려는 사용자는 AppContext 스위치를 false로 설정할 수 있습니다.

이름
Scope
버전 4.7
형식 대상 변경

영향을 받는 API

SslStream이 TLS 경고를 지원

설명

TLS 핸드셰이크가 실패하면 첫 번째 I/O 읽기/쓰기 작업에 의해 내부 System.ComponentModel.Win32Exception 예외가 있는 System.IO.IOException이 throw됩니다. System.ComponentModel.Win32ExceptionSystem.ComponentModel.Win32Exception.NativeErrorCode 코드는 TLS 및 SSL 경고에 대한 Schannel 오류 코드를 사용하여 원격 주체에서 TLS 경고로 매핑될 수 있습니다. 자세한 내용은 RFC 2246: 섹션 7.2.2 오류 경고를 참조하세요.
.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 이상 시스템에서 실행되는 .NET Framework 4.0에서 4.6.2까지 버전을 대상으로 하는 애플리케이션은 호환성을 유지하기 위해 사용하지 못하도록 설정하는 기능이 있습니다.
.NET Framework 4.7 이상에서 실행되는 .NET Framework 4.6 및 이상 애플리케이션에 대한 기능을 사용하거나 사용하지 못하도록 설정하려면 다음 구성 API를 사용할수 있습니다.

  • 프로그래밍 방식으로: 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>
    
  • 레지스트리 키(전역 컴퓨터): 값을 false로 설정하여 .NET Framework 4.6 - 4.6.2의 기능을 사용합니다.

    Key: HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext\Switch.System.Net.DontEnableTlsAlerts
    - Type: String
    - Value: "true"
    
속성
Scope Microsoft Edge
버전 4.7
형식 대상 변경

영향을 받는 API

WCF(Windows Communication Foundation)

DataContractJsonSerializer를 사용한 제어 문자의 serialization가 이제 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> 섹션에 다음 줄을 추가하여 이 기능을 옵트아웃(opt out)할 수 있습니다.

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Runtime.Serialization.DoNotUseECMAScriptV6EscapeControlCharacter=false" />
</runtime>
이름
Scope Microsoft Edge
버전 4.7
형식 대상 변경

영향을 받는 API

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>
이름
Scope Microsoft Edge
버전 4.7
형식 대상 변경

WPF(Windows Presentation Foundation)

터치 지원 시스템에서 System.Windows.Input.PenContext.Disable 호출하면 ArgumentException이 throw될 수 있음

설명

상황에 따라 터치 지원 시스템에서 내부 System.Windows.Input.PenContext.Disable 메서드를 호출하면 재진입 때문에 처리되지 않은 T:System.ArgumentException가 throw될 수 있습니다.

제안 해결 방법

이 문제는 .NET Framework 4.7에서 해결되었습니다. 예외를 방지하려면 .NET Framework 4.7 이상의 .NET Framework 버전으로 업그레이드합니다.

이름
Scope Microsoft Edge
버전 4.6.1
형식 대상 변경

ImageSourceConverter.ConvertFrom의 예외 처리 코드에서 NullReferenceException이 발생

설명

ConvertFrom(ITypeDescriptorContext, CultureInfo, Object)에 대한 예외 처리 코드의 오류로 인해 의도한 예외(System.IO.DirectoryNotFoundException 또는 System.IO.FileNotFoundException) 대신 잘못된 System.NullReferenceException이 throw됩니다. 이제 해당 오류를 수정하여 메서드에서 올바른 예외를 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>
이름
Scope Microsoft Edge
버전 4.7
형식 대상 변경

영향을 받는 API

별 열에 공간의 WPF 그리드 할당

세부 정보

.NET Framework 4.7부터 Grid가 *-열에 공간을 할당하는 데 사용하는 알고리즘 대신 WPF가 사용됩니다. 그러면 다음과 같은 많은 경우에 * 열에 할당되는 실제 너비를 변경합니다.

  • 하나 이상의 *-열이 해당 열에 대한 비례 할당을 재정의하는 최소 또는 최대 너비를 가지는 경우 (최소 너비는 명시적 MinWidth 선언에서 파생되거나 열 콘텐츠에서 얻은 암시적 최솟값에서 파생될 수 있습니다. 최대 너비는 MaxWidth 선언에서 명시적으로만 정의할 수 있습니다.)
  • 하나 이상의 * 열 선언이 10^298보다 큰 훨씬 큰 * 가중치를 선언하는 경우
  • * 가중치가 부동 소수점 불안정성(오버플로, 언더플로, 전체 자릿수 손실)을 야기할만큼 다른 경우
  • 레이아웃 조정이 사용되도록 설정되고 결과 디스플레이 DPI가 충분히 높은 경우 처음 두 경우에서 새 알고리즘에 의해 생성되는 너비는 이전 알고리즘에 의해 생성된 너비와 크게 다를 수 있습니다. 마지막 경우에서는 그 차이가 최대 하나 또는 두 개의 픽셀 정도입니다.

새 알고리즘은 이전 알고리즘의 다음과 같은 여러 버그를 해결합니다.

  • 열에 대한 전체 할당이 그리드 너비를 초과할 수 있습니다. 비례 공유 크기가 최소 크기보다 작은 열에 공간을 할당하면 이 문제가 발생할 수 있습니다. 이 알고리즘은 최소 크기를 할당하여 다른 열에서 사용할 수 있는 공간 크기를 줄입니다. 할당할 * 열이 남아 있지 않은 경우 전체 할당이 너무 커집니다.

  • 전체 할당은 그리드 너비보다 작을 수 있습니다. 이것은 여유 공간을 차지할 * 열이 남아 있지 않을 때 비례 공유가 최대 크기보다 큰 열에 할당하는 경우에 발생하는 #1에 대한 이중 문제입니다.

  • 두 * 열은 해당하는 * 가중치에 비례하지 않는 할당을 받을 수 있습니다. 이것은 * 열 A, B 및 C(해당 순서대로)에 할당할 때 B의 비례 공유가 최소(또는 최대) 제약 조건을 위반할 때 발생하는 #1/#2보다 좀 더 경미한 문제입니다. 이와 같이 열 C에서 사용할 수 있는 공간이 줄어들고 A보다 더 작은(또는 더 많은) 비례 할당을 얻게 됩니다.

  • 매우 큰 가중치(>10^298)가 적용된 열은 마치 가중치가 10^298인 것처럼 처리됩니다. 둘 열(및 가중치가 약간 더 작은 열) 간의 비례 차이는 유지되지 않습니다.

  • 무한 가중치를 갖는 열은 올바르게 처리되지 않습니다. (실제로 가중치를 무한대로 설정할 수 있지만 인위적으로 제한됩니다. 할당 코드가 처리하려고 했으나 잘못된 작업이 수행되었습니다.)

  • 오버플로, 언더플로, 전체 자릿수 손실 및 비슷한 부동 소수점 문제를 방지할 때 나타나는 몇 가지 경미한 문제

  • 레이아웃 조정이 충분히 높은 DPI에서 올바르지 않습니다. 새 알고리즘은 다음 조건을 충족하는 결과를 생성합니다.

    • \* 열에 할당된 실제 너비는 최소 너비보다 작지도 않고 최대 너비보다 크지도 않습니다.
    • 최소 또는 최대 너비가 할당되지 않은 각 *-열에는 해당하는 *-가중치에 비례하는 너비가 할당됩니다. 정확히 말해서 두 열을 각각 너비 x* 및 y*로 선언하며 어떤 열에도 최소 또는 최대 너비가 수신되지 않으면 열에 할당된 실제 너비 v 및 w는 동일한 비율 v / w == x / y가 됩니다.
    • 제한된 열(최소 또는 최대 너비가 할당된 고정, 자동 및 *-열)에 할당된 후에는 "비례적" *-열에 할당된 총 너비가 사용 가능한 공간과 같아집니다. 예를 들어 최소 너비의 합계가 그리드의 사용 가능한 너비를 초과하면 이 크기는 0이 될 수 있습니다.
    • 이러한 모든 설명은 "이상적" 레이아웃과 관련된 것으로 해석될 수 있습니다. 레이아웃 조정이 적용되면 실제 너비는 픽세 크기만큼 이상적 너비와 달라질 수 있습니다.

참고 항목

이 문서에서 열 및 너비에 대한 모든 내용은 행 및 높이에도 적용됩니다.

제안 해결 방법

기본적으로 .NET Framework 4.6.2 또는 이전 버전을 대상으로 하는 앱은 이전 알고리즘을 표시하지만 .NET Framework 4.7 이상 버전을 대상으로 하는 앱은 새 알고리즘을 표시합니다.

기본값을 재정의하려면 다음 구성 설정을 사용합니다.

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

true 값은 이전 알고리즘을 선택하고 false는 새 알고리즘을 선택합니다.

이름
Scope
버전 4.7
형식 대상 변경

WPF 포인터 기반 터치 스택

설명

이러한 변경은 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 크리에이터스 이상에서만 사용할 수 있습니다.

이름
Scope Microsoft Edge
버전 4.7
형식 대상 변경

Windows WF(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>
이름
Scope
버전 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 웹 컨트롤이 Visual Studio의 액세스 가능성 기술과 연동하는 방식을 개선하여 ASP.NET 고객을 보다 잘 지원하도록 했습니다. 여기에는 다음과 같은 변경이 포함됩니다.

  • 자세히 보기 마법사의 필드 추가 대화 상자 또는 ListView 마법사의 ListView 구성 대화 상자와 같이 컨트롤에서 누락된 UI 액세스 가능성 패턴을 구현하도록 변경됨.
  • 데이터 호출기 필드 편집기와 같이 고대비 모드에서 디스플레이를 개선하도록 변경됨.
  • DataPager 컨트롤의 [호출기 필드 편집] 마법사의 [필드] 대화 상자, [ObjectContext 구성] 대화 상자 또는 [데이터 원본 구성] 마법사의 [데이터 선택 구성] 대화 상자와 같은 컨트롤의 키보드 탐색 환경을 개선하도록 변경됨.

제안 해결 방법

이러한 변경을 선택/해제하는 방법 Visual Studio 디자이너에서 이러한 변경의 이점을 얻으려면 .NET Framework 4.7.1 이상에서 실행해야 합니다. 웹 애플리케이션은 다음과 같은 방법으로 이러한 변경의 이점을 활용할 수 있습니다.

  • 기본적으로 다음 AppContext 스위치를 사용하여 새로운 액세스 가능성 기능을 지원하는 Visual Studio 2017 15.3 이상을 설치합니다.
  • 다음 예제와 같이 devenv.exe.config 파일의 <runtime> 섹션에 Switch.UseLegacyAccessibilityFeatures AppContext 스위치를 추가하고 이를 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로 명확하게 설정하여 레거시 액세스 가능성 기능 사용을 옵트인할 수 있습니다.

이름
Scope
버전 4.7.1
형식 대상 변경

핵심

SerialPort 백그라운드 스레드 예외

세부 정보

SerialPort 스트림을 사용하여 만든 백그라운드 스레드는 OS 예외가 throw될 때 더 이상 프로세스를 종료하지 않습니다.
.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>
이름
Scope
버전 4.7.1
형식 대상 변경

영향을 받는 API

ServiceBase는 OnStart 예외를 전파하지 않음

세부 정보

.NET Framework 4.7 및 이전 버전에서 서비스 시작 시 throw되는 예외는 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" />
속성
Scope
버전 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" />
이름
Scope
버전 4.7.1
형식 대상 변경

영향을 받는 API

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" />
이름
Scope Microsoft Edge
버전 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>
이름
Scope Microsoft Edge
버전 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 Automation 개요를 참조하세요.

UI Automation 패턴 및 속성에 대한 추가된 지원

접근성 클라이언트는 일반적이고 공개적으로 설명된 호출 패턴을 사용하여 새로운 WinForms 접근성 기능을 활용할 수 있습니다. 이러한 패턴은 WinForms에 특정되지 않습니다. 예를 들어 접근성 클라이언트가 IAccessible 인터페이스(MAAS)의 QueryInterface 메서드를 호출하여 IServiceProvider 인터페이스를 가져올 수 있습니다. 이 인터페이스가 지원되면 클라이언트는 QueryService 메서드를 사용하여 IAccessibleEx 인터페이스를 요청할 수 있습니다. 자세한 내용은 클라이언트에서 IAccessibleEx 사용을 참조하세요. .NET Framework 4.7.1, IServiceProvider 및 IAccessibleEx(적용 가능한 경우)부터는 WinForms 접근성 개체에 지원됩니다.

.NET Framework 4.7.1은 다음 UI 자동화 패턴 및 속성에 대한 지원을 추가합니다.

고대비 테마에서 OS 정의 색 사용

  • 기본 스타일인 FlatStyle.System로 설정된 FlatStyle 속성을 사용하는 ButtonCheckBox 컨트롤은 선택된 경우 고대비 테마에서 OS 정의 색을 사용합니다. 이전에 텍스트 및 배경색이 대비되지 않았고 읽기가 어려웠습니다.
  • false로 설정된 해당 Enabled 속성을 사용한 Button, CheckBox, RadioButton, Label, LinkLabelGroupBox 컨트롤은 음영이 있는 색을 사용하여 고대비 테마의 텍스트를 렌더링합니다. 따라서 배경에서 대비가 낮아집니다. 이제 이러한 컨트롤은 OS에서 정의된 "비활성 텍스트" 색을 사용합니다. 이 수정 사항은 FlatStyle 속성이 FlatStyle.System 이외의 값으로 설정된 컨트롤에 적용됩니다. 두 번째 컨트롤은 OS에서 렌더링됩니다.
  • 이제 DataGridView는 현재 포커스가 있는 셀의 컨텐츠 주위에 표시 가능한 사각형을 렌더링합니다. 이전에는 특정 고대비 테마에 표시되지 않았습니다.
  • 이제 Enabled 속성이 false로 설정된 ToolStripMenuItem 컨트롤은 OS에서 정의한 "비활성 텍스트" 색을 사용합니다.
  • 이제 Checked 속성이 true로 설정된 ToolStripMenuItem 컨트롤은 대비 시스템 색에서 연결된 확인 표시를 렌더링합니다. 이전에는 확인 표시 색이 충분히 대비되지 않고 고대비 테마에서 표시되지 않습니다. 참고: Windows 10은 일부 고대비 시스템 색에 대한 값을 변경했습니다. Windows Forms Framework는 Win32 프레임워크를 기반으로 합니다. 환경을 최적화하기 위해 테스트 애플리케이션에 app.manifest 파일을 추가하고 다음과 같은 코드의 주석을 제거하여 최신 버전의 Windows에서 실행하고 최신 OS 변경 사항을 옵트인합니다.
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

바로 가기 탐색 개선

  • ComboBox 컨트롤에 DropDownStyle 속성이 ComboBoxStyle.DropDownList로 설정되고 해당 컨트롤이 양식의 탭 순서에서 첫 번째 컨트롤인 경우 바로 가기를 사용하여 부모 양식을 열 때 포커스 사각형을 표시합니다. 이러한 변경 전에 키보드 포커스는 이 컨트롤에 적용되었지만 포커스 표시기가 렌더링되지 않았습니다.

향상된 내레이터 지원

  • MonthCalendar 컨트롤에서는 이전에 수행하지 못할 경우 내레이터가 컨트롤의 값을 읽는 기능을 비롯하여 컨트롤에 액세스하는 보조 기술에 대한 지원을 추가했습니다.

  • 이제 CheckBox.CheckState 속성이 변경된 경우 CheckedListBox 컨트롤은 내레이터에게 알림을 보냅니다. 이전에는 내레이터가 알림을 수신하지 않았고 결과적으로 사용자가 CheckState 속성이 업데이트되었음을 알지 못했습니다.

  • LinkLabel 컨트롤이 컨트롤에서 텍스트를 내레이터에 알리는 방식으로 변경되었습니다. 이전에는 내레이터가 이 텍스트를 두 번 공지하고, 사용자에게 표시되지 않는 경우에도 "&" 기호를 실제 텍스트로 읽었습니다. 불필요한 "&" 기호뿐만 아니라 중복된 텍스트도 내레이터 공지에서 제거되었습니다.

  • 이제 DataGridViewCell 컨트롤 형식은 내레이터에 대한 읽기 전용 상태 및 기타 보조 기술을 올바르게 보고합니다.

  • 내레이터는 이제 [Multiple-Document Interface]~/docs/framework/winforms/advanced/multiple-document-interface-mdi-applications.md) 애플리케이션에서 자식 창의 시스템 메뉴를 읽을 수 있습니다.

  • 이제 내레이터는 ToolStripItem.Enabled 속성이 false로 설정된 ToolStripMenuItem 컨트롤을 읽을 수 있습니다. 이전에는 내레이터가 콘텐츠를 읽기 위해 비활성화된 메뉴 항목에 초점을 맞출 수 없었습니다.

이름
Scope 주요함
버전 4.8
형식 대상 변경

영향을 받는 API

WPF(Windows Presentation Foundation)

WPF의 접근성 개선 사항

설명

고대비 개선 사항

  • 이제 Expander 컨트롤에 대한 포커스가 표시됩니다. 이전 버전의 .NET Framework에서는 그렇지 않았습니다.
  • CheckBoxRadioButton 컨트롤의 텍스트를 선택하면 이전 .NET Framework 버전보다 보기 쉽습니다.
  • 비활성화된 ComboBox의 테두리는 이제 비활성화된 텍스트와 동일한 색입니다. 이전 버전의 .NET Framework에서는 그렇지 않았습니다.
  • 이제 비활성화되고 포커스가 있는 단추는 올바른 테마 색을 사용합니다. 이전 버전의 .NET Framework에서는 그러지 않았습니다.
  • 이제는 ComboBox 컨트롤의 스타일이 ToolBar.ComboBoxStyleKey으로 설정된 경우 드롭다운 단추가 표시됩니다. 이전 버전의 .NET Framework에서는 그렇지 않았습니다.
  • 이제 DataGrid 컨트롤의 정렬 표시기 화살표는 테마 색을 사용합니다. 이전 버전의 .NET Framework에서는 그러지 않았습니다.
  • 이제 마우스를 위에 가져가면 기본 하이퍼링크 스타일이 올바른 테마 색으로 변경됩니다. 이전 버전의 .NET Framework에서는 그러지 않았습니다.
  • 이제 라디오 단추에서 바로 가기 포커스가 표시됩니다. 이전 버전의 .NET Framework에서는 그렇지 않았습니다.
  • 이제 DataGrid 컨트롤의 확인란 열은 바로 가기 포커스 피드백에 예상되는 색을 사용합니다. 이전 버전의 .NET Framework에서는 그러지 않았습니다.
  • 이제 바로 가기 포커스 시각적 개체가 ComboBoxListBox 컨트롤에 표시됩니다. 이전 버전의 .NET Framework에서는 그렇지 않았습니다.

화면 읽기 프로그램 상호 작용 개선 사항

  • 이제 Expander 컨트롤은 화면 읽기 프로그램에서 그룹(확장/축소)으로 올바르게 추가됩니다.
  • 이제 DataGridCell 컨트롤은 화면 읽기 프로그램에서 데이터 그리드(지역화됨)으로 올바르게 추가됩니다.
  • 이제 화면 읽기 프로그램이 편집 가능한 ComboBox의 이름을 추가합니다.
  • PasswordBox 컨트롤은 더 이상 화면 읽기 프로그램에서 “보기의 항목 없음”으로 추가되지 않습니다.

LiveRegion 지원

내레이터와 같은 화면 판독기는 현재 포커스가 있는 UI 요소를 설명하는 애플리케이션의 UI(사용자 인터페이스)를 사용자가 이해하는 데 도움을 줍니다. 그러나 화면에서 UI 요소가 변경되고 포커스가 없는 경우 사용자는 알림을 받지 못하고 중요한 정보를 놓칠 수 있습니다. LiveRegions는 이 문제를 해결해야 합니다. 개발자는 화면 판독기 또는 다른 UI Automation 클라이언트에게 UI 요소에 중요한 변경 내용이 만들어졌음을 알리는 데 사용할 수 있습니다. 화면 판독기는 사용자에게 이 변경 내용을 알리는 방법 및 시점을 결정할 수 있습니다. 또한 LiveSetting 속성을 통해 UI에 대한 변경 내용을 사용자에게 알리는 것이 얼마나 중요한지 화면 읽기 프로그램에 알릴 수 있습니다.

제안 해결 방법

이 변경 내용을 옵트인 또는 옵트아웃하는 방법

애플리케이션이 이러한 변경의 이점을 활용하도록 하기 위해 .NET Framework 4.7.1 이상에서 실행해야 합니다. 애플리케이션은 다음과 같은 방법으로 이러한 변경의 이점을 활용할 수 있습니다.

  • .NET Framework 4.7.1을 대상으로 지정합니다. 이는 권장되는 방법입니다. 이러한 서비스 효율성 변경 내용은 .NET Framework 4.7.1 이상을 대상으로 하는 WPF 애플리케이션에서 기본적으로 활성화됩니다.

  • 다음 예제와 같이 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 Automation 개요를 참조하세요.

이름
Scope 주요함
버전 4.7.1
형식 대상 변경

영향을 받는 API

선택기 SelectionChanged 이벤트 및 SelectedValue 속성

세부 정보

.NET Framework 4.7.1부터 Selector는 해당 선택 항목이 변경될 때 SelectionChanged 이벤트를 발생시키기 전에 SelectedValue 속성의 값을 항상 업데이트합니다. 이렇게 하면 SelectedValue 속성은 이벤트를 발생시키기 전에 업데이트되는 다른 선택 속성(SelectedItemSelectedIndex)과 일치하게 됩니다.

.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>
이름
Scope
버전 4.7.1
형식 대상 변경

영향을 받는 API

TabControl SelectionChanged 이벤트 및 SelectedContent 속성

세부 정보

4.7.1,.NET Framework부터는 선택 항목이 변경될 때 TabControlSelectionChanged 이벤트를 발생시키기 전에 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>
이름
Scope
버전 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>
이름
Scope Microsoft Edge
버전 4.7.1
형식 대상 변경

영향을 받는 API

Windows WF(Workflow Foundation)

Windows WF(Workflow Foundation) 워크플로 디자이너의 접근성 개선 사항

세부 정보

Windows WF(Workflow Foundation) 워크플로 디자이너는 접근성 기술 작동 방법을 개선합니다. 개선 사항에는 다음과 같은 변경 내용이 포함됩니다.

  • 일부 컨트롤에서 왼쪽에서 오른쪽으로, 위쪽에서 아래쪽으로 탭 순서를 변경합니다.
  • InitializeCorrelation 작업에 대한 상관 관계 데이터를 설정하는 초기화 상관 관계 창
  • Receive, Send, SendReplyReceiveReply 작업에 대한 콘텐츠 정의 창
  • 바로 가기를 통해 추가 함수가 지원됩니다.
  • 작업의 속성을 편집할 때 처음으로 포커스된 경우 바로 가기에서 속성 그룹을 축소할 수 있습니다.
  • 이제 경고 아이콘은 바로 가기에서 액세스할 수 있습니다.
  • 바로 가기에서 속성 창의 추가 속성 단추에 액세스할 수 있습니다.
  • 이제 바로 가기 사용자는 워크플로 디자이너의 인수 및 변수 창에 있는 헤더 항목에 액세스할 수 있습니다.
  • 다음과 같은 경우 포커스가 있는 항목의 표시 유형 향상
  • 워크플로 디자이너 및 작업 디자이너에서 사용하는 데이터 그리드에 행 추가
  • ReceiveReplySendReply 작업에서 필드 누름
  • 변수 또는 인수에 대한 기본값 설정
  • 이제 화면 읽기 프로그램이 다음 항목을 올바르게 인식합니다.
  • 워크플로 디자이너에서 설정된 중단점
  • FlowSwitch<T>, FlowDecisionCorrelationScope 작업
  • Receive 작업의 콘텐츠
  • InvokeMethod 작업의 대상 유형
  • TryCatch 작업의 예외 콤보 상자 및 마지막 섹션
  • 메시지 유형 콤보 상자, 상관 관계 이니셜라이저 추가 창의 분할기, 콘텐츠 정의 창 및 메시징 작업의 CorrelatesOn 정의 창(Receive, Send, SendReplyReceiveReply)
  • 상태 컴퓨터 전환 및 전환 대상
  • FlowDecision 작업의 주석 및 커넥터
  • 작업의 팝업(마우스 오른쪽 단추 클릭) 메뉴
  • 속성 값 편집기, 검색 정리 단추, 범주별으로 및 사전순 정렬 단추 및 속성 그리드의 식 편집기 대화 상자
  • 워크플로 디자이너의 확대/축소 백분율
  • ParallelPick 작업의 구분 기호
  • 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로 명확하게 설정하여 레거시 액세스 가능성 기능 사용을 옵트인할 수 있습니다.

이름
Scope
버전 4.7.1
형식 대상 변경

.NET Framework 4.7.2

코어

URI에서 유니코드 양방향 컨트롤 문자 허용

설명

유니코드는 텍스트의 방향을 지정하는 데 사용되는 몇 가지 특수 컨트롤 문자를 지정합니다. 이전 버전의 .NET Framework에서 이러한 문자는 백분율로 인코딩된 형식으로 존재했더라도 모든 URI에서 올바르지 않게 제거되었습니다. RFC 3987을 더 잘 따르기 위해 이제 URI에서 이러한 문자를 허용합니다. URI에서 인코딩되지 않은 것을 발견한 경우 백분율로 인코딩됩니다. 백분율로 인코딩된 것을 발견한 경우 그대로 유지됩니다.

제안 해결 방법

4\.7.2 이상의 .NET Framework 버전을 대상으로 하는 애플리케이션의 경우 유니코드 양방향 문자에 대한 지원이 기본적으로 활성화됩니다. 이 변경을 원치 않는 경우 다음 AppContextSwitchOverrides 스위치를 애플리케이션 구성 파일의 <runtime> 섹션에 추가하여 비활성화할 수 있습니다.

<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>
이름
Scope
버전 4.7.2
형식 대상 변경

영향을 받는 API

DeflateStream은 압축 풀기에 네이티브 API를 사용합니다.

설명

.NET Framework 4.7.2부터 T:System.IO.Compression.DeflateStream 클래스에서 압축 풀기의 구현은 기본적으로 네이티브 Windows API를 사용하는 것으로 변경되었습니다. 일반적으로 이로 인해 성능이 크게 향상됩니다. .NET Framework 버전 4.7.2 이상을 대상으로 하는 모든 .NET 애플리케이션은 네이티브 구현을 사용합니다. 이 변경 내용으로 인해 다음을 포함하여 동작에 일부 차이점이 발생할 수 있습니다.

  • 예외 메시지는 달라질 수 있습니다. 그러나 throw된 예외의 형식은 유지됩니다.
  • 작업을 완료하는 데 메모리가 충분하지 않은 것과 같은 일부 특수한 상황은 다르게 처리될 수 있습니다.
  • gzip 헤더를 구문 분석하는 데 알려진 차이점이 있습니다(참고: 압축 풀기에 대한 GZipStream 설정만 영향을 받음).
  • 잘못된 헤더를 구분 분석하는 경우 예외는 서로 다른 시간에 throw될 수 있습니다.
  • 네이티브 구현은 gzip 헤더 내부의 일부 예약된 플래그에 대한 값(즉, FLG)이 사양에 따라 설정되도록 적용합니다. 이로 인해 이전에 잘못된 값이 무시되었던 예외를 throw할 수 있습니다.

제안 해결 방법

네이티브 API를 사용하는 압축 풀기가 앱의 동작에 부정적으로 영향을 준 경우 app.config 파일의 runtime 섹션에 Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression 스위치를 추가하고 true로 설정하여 이 기능을 옵트아웃할 수 있습니다.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression=true" />
  </runtime>
</configuration>
이름
Scope
버전 4.7.2
형식 대상 변경

영향을 받는 API

System.Uri가 일관된 예약된 문자 집합을 사용하는지 확인합니다.

세부 정보

System.Uri에서 때로는 디코딩되는 특정 백분율로 인코딩된 문자는 이제 일관되게 인코딩됩니다. 이는 URI의 경로, 쿼리, 조각 또는 사용자 정보 구성 요소에 액세스하는 속성 및 메서드에서 발생합니다. 이 동작은 다음 두 항목 모두가 true인 경우에만 변경됩니다.

  • URI는 다음 예약된 문자의 인코딩된 형식을 포함합니다. :, ', (, ), ! 또는 *
  • URI는 유니코드 또는 인코딩된 예약되지 않은 문자를 포함합니다. 위의 두 항목 모두가 true인 경우 인코딩된 예약된 문자는 인코딩됩니다. 이전 버전의 .NET Framework에서는 디코딩됩니다.

제안 해결 방법

4\.7.2 이상의 .NET Framework 버전을 대상으로 하는 애플리케이션의 경우 새로운 디코딩 동작이 기본적으로 활성화됩니다. 이 변경을 원치 않는 경우 다음 AppContextSwitchOverrides 스위치를 애플리케이션 구성 파일의 <runtime> 섹션에 추가하여 비활성화할 수 있습니다.

<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>
이름
Scope
버전 4.7.2
형식 대상 변경

영향을 받는 API

Resgen에서 웹으로부터 콘텐츠 로드를 거부

설명

.resx 파일에는 이진 형식의 입력이 포함될 수 있습니다. Resgen을 사용하여 신뢰할 수 없는 위치에서 다운로드한 파일을 로드하려고 하면 기본적으로 입력이 로드되지 않습니다.

제안 해결 방법

신뢰할 수 없는 위치에서 이진 형식 입력을 로드해야 하는 Resgen 사용자는 입력 파일에서 웹 표시를 제거하거나 쿼크 옵트아웃을 적용할 수 있습니다. 컴퓨터 수준에서 쿼크 옵트아웃을 적용하려면 다음 레지스트리 설정을 추가합니다. [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\SDK] "AllowProcessOfUntrustedResourceFiles"="true"

속성
Scope Microsoft Edge
버전 4.7.2
형식 대상 변경

휴대용 PDB를 사용할 때 가져온 스택 추적은 이제 요청된 경우 원본 파일 및 줄 정보를 포함합니다.

설명

.NET Framework 4.7.2부터 휴대용 PDB를 사용할 때 가져온 스택 추적은 요청된 경우 원본 파일 및 줄 정보를 포함합니다. .NET Framework 4.7.2 이전 버전에서 명시적으로 요청된 경우에도 휴대용 PDB를 사용할 때 원본 파일 및 줄 정보를 사용할 수 없습니다.

제안 해결 방법

.NET Framework 4.7.2를 대상으로 하는 애플리케이션의 경우, 필요하지 않으면 app.config 파일의 <runtime> 섹션에 다음을 추가하여 휴대용 PDB를 사용할 때 원본 파일 및 줄 정보를 옵트아웃할 수 있습니다.

<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>
이름
Scope Microsoft Edge
버전 4.7.2
형식 대상 변경

영향을 받는 API

Windows Forms

.NET 4.7.2에 대한 Windows Forms 콘트롤의 접근성 개선 사항

설명

Windows Forms Framework는 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 이전 버전을 대상으로 하며 다음 예제와 같이 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;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의 드롭다운 화살표는 이제 고대비 테마에서 OS 정의 색을 사용합니다.
  • FlatStyleFlatStyle.Flat 또는 FlatStyle.Popup으로 설정한 Button, RadioButtonCheckBox 컨트롤은 선택된 경우 고대비 테마에서 OS 정의 색을 사용합니다. 이전에 텍스트 및 배경색이 대비되지 않았고 읽기가 어려웠습니다.
  • Enabled 속성을 false으로 설정한 GroupBox에 포함된 컨트롤은 이제 고대비 테마에서 OS 정의 색을 사용하게 됩니다.
  • ToolStripButton, ToolStripComboBoxToolStripDropDownButton 컨트롤이 고대비 모드에서 명도 대비를 증가시켰습니다.
  • DataGridViewLinkCell은 기본적으로 DataGridViewLinkCell.LinkColor 속성에 대한 고대비 모드에서 OS 정의 색을 사용합니다. 참고: Windows 10은 일부 고대비 시스템 색에 대한 값을 변경했습니다. Windows Forms Framework는 Win32 프레임워크를 기반으로 합니다. 환경을 최적화하기 위해 테스트 애플리케이션에 app.manifest 파일을 추가하고 다음과 같은 코드의 주석을 제거하여 최신 버전의 Windows에서 실행하고 최신 OS 변경 사항을 옵트인합니다.
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

향상된 내레이터 지원

  • ToolStripMenuItem의 텍스트를 발표할 경우 내레이터는 ToolStripMenuItem.ShortcutKeys 속성 값도 발표합니다.
  • 내레이터는 ToolStripMenuItem이 해당 Enabled 속성을 false으로 설정할 때를 지정합니다.
  • 내레이터는 ListView.CheckBoxes 속성이 true로 설정될 경우 확인란의 상태에 대한 피드백을 제공합니다.
  • 내레이터 스캔 모드 포커스 순서는 ClickOnce 다운로드 대화 상자 창에서 컨트롤의 시각적 개체 순서와 일치합니다.

개선된 DataGridView 접근성 지원

개선된 시각적 표시

  • Text 속성이 빈 RadioButtonCheckBox 컨트롤은 포커스를 받을 때 포커스 표시기를 표시합니다.

개선된 속성 표 지원

이름
Scope 주요함
버전 4.7.2
형식 대상 변경

중첩된 ToolStripMenuItems의 경우 ContextMenuStrip.SourceControl 속성은 유효한 컨트롤 포함함

설명

.NET Framework 4.7.1 및 이전 버전에서 사용자가 중첩된 ToolStripMenuItem 컨트롤에서 메뉴를 열 경우 ContextMenuStrip.SourceControl 속성은 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 스위치를 추가하고 이를 false로 설정하여 레거시 접근성 동작을 옵트아웃합니다.
<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue=false"/>
</runtime>

.NET Framework 4.7.2 이상을 대상으로 하고 레거시 동작을 유지하려는 애플리케이션은 이 AppContext 스위치를 true로 명확하게 설정하여 레거시 원본 제어 값 사용을 옵트인할 수 있습니다.

이름
Scope Microsoft Edge
버전 4.7.2
형식 대상 변경

영향을 받는 API

PrivateFontCollection.AddFontFile 메서드가 글꼴 리소스를 릴리스함

설명

.NET Framework 4.7.1 및 이전 버전에서 AddFontFile(String) 메서드를 사용하여 이 컬렉션에 추가된 Font 개체에 대해 PrivateFontCollection를 삭제한 후 System.Drawing.Text.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 이전 버전을 대상으로 하며 다음 예제와 같이 app.config 파일의 <runtime> 섹션에 AppContext 스위치를 추가하고 이를 false로 설정하여 레거시 접근성 동작을 옵트아웃합니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Drawing.Text.DoNotRemoveGdiFontsResourcesFromFontCollection=false"/>
</runtime>

.NET Framework 4.7.2 이상을 대상으로 하고 레거시 동작을 유지하려는 애플리케이션은 이 AppContext 스위치를 true로 명확하게 설정하여 글꼴 리소스를 릴리스하지 않도록 옵트인할 수 있습니다.

이름
Scope Microsoft Edge
버전 4.7.2
형식 대상 변경

영향을 받는 API

WinForm의 도메인 UpButton 및 DownButton 작업이 지금 동기화됨

설명

.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 애플리케이션에서 기본적으로 활성화됩니다.
  • 다음 예제와 같이 app.config 파일의 <runtime> 섹션에 AppContext 스위치를 추가하고 이를 false로 설정하여 레거시 스크롤 동작을 옵트아웃합니다.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling=false"/>
</runtime>
이름
Scope Microsoft Edge
버전 4.7.2
형식 대상 변경

영향을 받는 API

WPF(Windows Presentation Foundation)

키보드 포커스는 이제 WinForms/WPF 호스팅의 여러 계층에서 제대로 이동합니다.

설명

차례로 WPF 컨트롤을 호스트하는 WinForms 컨트롤을 호스팅하는 WPF 애플리케이션을 고려합니다. 사용자는 해당 계층의 첫 번째 또는 마지막 컨트롤이 WPF System.Windows.Forms.Integration.ElementHost이면 WinForms 계층에서 이동할 수 없습니다. 이 변경 내용은 이 문제를 해결하고, 사용자는 이제 WinForms 계층에서 이동할 수 있습니다. WinForms 계층을 이스케이프하지 않는 포커스를 사용하는 자동화된 애플리케이션은 더 이상 예상대로 작동하지 않을 수 있습니다.

제안 해결 방법

.NET 4.7.2 이전의 프레임워크 버전을 대상으로 하는 동안 이 변경 내용을 활용하려는 개발자는 변경 내용을 활성화하기 위해 false로 AppContext 플래그의 다음 집합을 설정할 수 있습니다.

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

WPF 애플리케이션은 최신 개선 사항을 가져오도록 모든 초기 접근성 개선 사항으로 옵트인해야 합니다. 즉, Switch.UseLegacyAccessibilityFeaturesSwitch.UseLegacyAccessibilityFeatures.2 스위치 모두는 .NET 4.7.2 이상을 대상으로 하는 동안 이전 기능을 필요로 하는 A 개발자가 변경 내용을 활성화하지 못하도록 다음 AppContext 플래그를 true로 설정할 수 있도록 설정해야 합니다.

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures.2=true"/>
</runtime>
</configuration>
이름
Scope Microsoft Edge
버전 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>
이름
Scope 투명
버전 4.7.2
형식 대상 변경

WPF AppDomain 종료 처리가 이제 약한 이벤트 정리에서 Dispatcher.Invoke를 호출할 수 있음

설명

.NET Framework 4.7.1 이전 버전에서 WPF는 잠재적으로 AppDomain 종료 중에 .NET 종료자 스레드에 대한 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>
이름
Scope Microsoft Edge
버전 4.7.2
형식 대상 변경

마스터/세부 정보 시나리오에서 ADO 데이터를 표시할 때 기본 키를 변경하는 WPF

설명

Order 형식 항목의 ADO 컬렉션이 있고 기본 키 "OrderID"를 통해 ADO 컬렉션을 Detail 형식 항목의 컬렉션에 연결하는 "OrderDetails"라는 관계가 있다고 가정합니다. WPF 앱에서 목록 컨트롤을 지정된 순서에 대한 세부 정보에 바인딩할 수 있습니다.

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

DataContext가 Order인 경우. WPF는 OrderID가 마스터 항목의 OrderID와 일치하는 모든 Detail 항목의 컬렉션 D인 OrderDetails 속성 값을 가져옵니다. 마스터 항목의 기본 키 OrderID를 변경하면 동작 변경이 발생합니다. ADO는 세부 정보 컬렉션에 있는 영향을 받는 각 레코드(컬렉션 D로 복사된 레코드)의 OrderID를 자동으로 변경합니다. 하지만 D는 어떻게 처리될까요?

  • 이전 동작: 컬렉션 D가 지워집니다. 마스터 항목이 OrderDetails 속성에 대한 변경 알림을 표시하지 않습니다. 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(새 동작)로 설정됩니다.

이름
Scope
버전 4.7.2
형식 대상 변경

RadioButton 및 CheckBox용 WPF FocusVisual은 컨트롤이 콘텐츠가 없을 경우 올바르게 표시됨

설명

.NET Framework 4.7.1 및 이전 버전에서 WPF System.Windows.Controls.CheckBoxSystem.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>
이름
Scope Microsoft Edge
버전 4.7.2
형식 대상 변경

WPF TextBox/PasswordBox 텍스트 선택은 시스템 색을 따르지 않음

설명

.NET Framework 4.7.1 이전 버전에서 WPF System.Windows.Controls.TextBoxSystem.Windows.Controls.PasswordBox는 표시기(Adorner) 계층에서 텍스트 선택만 렌터링할 수 있었습니다. 일부 시스템 테마에서 텍스트를 가려서 읽기 어려울 수 있습니다. .NET Framework 4.7.2 이상 버전에서 개발자는 이 문제를 완화하는 비 표시기(Adorner) 기반 선택 렌더링 체계를 활성화하는 옵션이 있습니다.

제안 해결 방법

이 변경 내용을 활용하려는 개발자는 다음 AppContext 플래그를 적절하게 설정해야 합니다. 이 기능을 사용하려면 설치된 .NET Framework 버전이 4.7.2 이상이어야 합니다. 비 표시기 기반 선택을 활성화하려면 다음 AppContext 플래그를 사용합니다.

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.Text.UseAdornerForTextboxSelectionRendering=false"/>
</runtime>
</configuration>
이름
Scope Microsoft Edge
버전 4.7.2
형식 대상 변경

Windows WF(Workflow Foundation)

IWorkflowInstanceManagement.TransactedCancel 및 IWorkflowInstanceManagement.TransactedTerminate의 무한 재귀를 방지

설명

IWorkflowInstanceManagement.TransactedCancel 또는 IWorkflowInstanceManagement.TransactedTerminate API를 사용하여 워크플로 인스턴스를 취소하거나 종료하는 경우에 워크플로 인스턴스는 Workflow 런타임이 요청 처리의 일부로 서비스 인스턴스를 유지하려 할 때 무한 재귀로 인해 스택 오버플로가 발생할 수 있습니다. 워크플로 인스턴스가 다른 서비스에 대한 기타 미처리 WCF 요청이 완료되기를 기다리고 있는 상태인 경우 문제가 발생합니다. TransactedCancelTransactedTerminate 작업은 워크플로 서비스 인스턴스에 대해 큐 대기 중인 작업 항목을 만듭니다. 이러한 작업 항목은 TransactedCancel/TransactedTerminate 요청 처리의 일부로 실행되지 않습니다. 워크플로 서비스 인스턴스는 기타 처리 중인 WCF 요청이 완료되기를 기다리느라 사용 중이므로 만든 작업 항목은 큐 대기 상태를 유지합니다. TransactedCancel/TransactedTerminate 작업이 완료되고 컨트롤이 다시 클라이언트로 반환됩니다. TransactedCancel/TransactedTerminate 작업과 연관된 트랜잭션이 커밋하려 하는 경우 워크플로 서비스 인스턴스 상태를 유지해야 합니다. 그러나 인스턴스에 대해 처리 중인 WCF 요청이 있기 때문에 워크플로 런타임은 워크플로 서비스 인스턴스를 지속할 수 없고 무한 재귀 루프는 스택 오버플로로 이어집니다. TransactedCancelTransactedTerminate만 메모리에 작업 항목을 만드므로 트랜잭션이 존재한다는 팩트는 아무 영향도 줄 수 없습니다. 트랜잭션 롤백은 작업 항목을 삭제하지 않습니다. 이 문제를 해결하기 위해 .NET Framework 4.7.2부터 TransactedCancelTransactedTerminate에 대한 트랜잭션을 무시하도록 지시하는 워크플로 서비스의 web.config/app.config에 추가될 수 있는 AppSetting을 도입했습니다. 이렇게 하면 트랜잭션이 워크플로 인스턴스가 유지되기를 기다리지 않고 커밋할 수 있습니다. 이 기능에 대한 AppSetting은 microsoft:WorkflowServices:IgnoreTransactionsForTransactedCancelAndTransactedTerminate입니다. true 값은 트랜잭션을 무시하고 따라서 스택 오버플로를 방지해야 한다는 것을 나타냅니다. 이 AppSetting의 기본값은 false이므로 기존 워크플로 서비스 인스턴스는 영향을 받지 않습니다.

제안 해결 방법

AppFabric 또는 다른 IWorkflowInstanceManagement 클라이언트를 사용하고, 워크플로 인스턴스를 취소하거나 종료하려고 할 때 워크플로 서비스 인스턴스에서 스택 오버플로가 발생하는 경우 워크플로 서비스에 대한 web.config/app.config 파일의 <appSettings> 섹션에 다음을 추가할 수 있습니다.

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

문제가 발생하지 않는 경우 이 작업을 수행할 필요가 없습니다.

이름
Scope Microsoft Edge
버전 4.7.2
형식 대상 변경