.NET Framework에서 .NET Core로 마이그레이션 시 호환성이 손상되는 변경 사항
.NET Framework에서 .NET Core 버전 1.0~3.1로 앱을 마이그레이션하는 경우 이 문서에 나열된 호환성이 손상되는 변경이 영향을 줄 수 있습니다. 주요 변경 사항은 범주별로 그룹화되며 해당 범주 내에서는 도입된 .NET Core 버전에 따라 그룹화됩니다.
참고 항목
이 문서는 .NET Framework와 .NET Core 간 호환성이 손상되는 변경 사항의 전체 목록이 아닙니다. 가장 중요한 호환성이 손상되는 변경 사항은 이를 인식하는 대로 여기에 추가됩니다.
핵심 .NET 라이브러리
- UseShellExecute의 기본값 변경
- IDispatchImplAttribute API가 제거되었습니다.
- FileSystemInfo.Attributes가 throw하는 UnauthorizedAccessException
- 손상된 프로세스 상태 예외 처리는 지원되지 않음
- UriBuilder 속성은 더 이상 앞에 선행 문자를 추가하지 않음
- Process.StartInfo는 코드가 시작하지 않은 프로세스에 대해 InvalidOperationException을 throw함
.NET 8
IDispatchImplAttribute API가 제거되었습니다.
.NET Core 2.1
UseShellExecute의 기본값 변경
ProcessStartInfo.UseShellExecute의 기본값은 .NET Core에서 false
입니다. .NET Framework에서의 기본값은 true
입니다.
변경 내용 설명
Process.Start 사용을 통해 애플리케이션을 직접 실행할 수 있습니다. 예를 들어 Process.Start("mspaint.exe")
와 같은 코드를 사용하면 그림판이 실행됩니다. ProcessStartInfo.UseShellExecute이 true
로 설정된 경우 연결된 애플리케이션을 간접적으로 시작할 수도 있습니다. .NET Framework에서 ProcessStartInfo.UseShellExecute의 기본값은 true
입니다. 따라서 해당 편집기를 사용하여 .txt과 연결한 경우 Process.Start("mytextfile.txt")
와 같은 코드로 메모장이 시작됩니다. .NET Framework에서 간접적으로 앱을 시작하는 것을 방지하려면 명시적으로 ProcessStartInfo.UseShellExecute을 false
로 설정해야 합니다. .NET Core에서 ProcessStartInfo.UseShellExecute의 기본값은 false
입니다. 따라서 기본적으로 Process.Start
를 호출할 때 연결된 애플리케이션이 시작되지 않습니다.
System.Diagnostics.ProcessStartInfo의 다음 속성은 ProcessStartInfo.UseShellExecute가 true
인 경우에만 작동합니다.
- ProcessStartInfo.CreateNoWindow
- ProcessStartInfo.ErrorDialog
- ProcessStartInfo.Verb
- ProcessStartInfo.WindowStyle.
이 변경 사항은 성능 사유로 인해 .NET Core에 도입되었습니다. 일반적으로 Process.Start은 애플리케이션을 직접 시작하는 데 사용됩니다. 앱을 직접 시작하는 경우 Windows 셸을 포함하지 않아도 되며 관련된 성능 비용도 발생하지 않습니다. 이 기본 사례를 더욱 빠르게 하도록 .NET Core는 ProcessStartInfo.UseShellExecute의 기본값을 false
로 변경합니다. 필요한 경우 느린 경로로 옵트인할 수 있습니다.
도입된 버전
2.1
참고 항목
이전 버전의 .NET Core에서 UseShellExecute
는 Windows에 구현되지 않았습니다.
권장 작업
앱이 이전 동작에 의존하는 경우 ProcessStartInfo 개체에서 UseShellExecute가 true
로 설정된 상태에서 Process.Start(ProcessStartInfo)을 호출합니다.
범주
핵심 .NET 라이브러리
영향을 받는 API
.NET Core 1.0
FileSystemInfo.Attributes가 throw하는 UnauthorizedAccessException
.NET Core에서 호출자가 파일 특성 값을 설정하려고 하지만 쓰기 권한이 없는 경우 UnauthorizedAccessException이 throw됩니다.
변경 내용 설명
.NET Framework에서 호출자가 FileSystemInfo.Attributes에서 파일 특성 값을 설정하려고 하지만 쓰기 권한이 없는 경우 ArgumentException이 throw됩니다. .NET Core에서는 대신 UnauthorizedAccessException이 throw됩니다. (.NET Core에서 호출자가 잘못된 파일 특성을 설정하려고 시도하는 경우 여전히 ArgumentException이 throw됩니다.)
도입된 버전
1.0
권장 작업
필요에 따라 ArgumentException 대신 또는 추가로 UnauthorizedAccessException을 catch하도록 catch
문을 수정합니다.
범주
핵심 .NET 라이브러리
영향을 받는 API
손상된 상태 예외 처리는 지원되지 않음
.NET Core에서 손상된 프로세스 상태 예외 처리는 지원되지 않습니다.
변경 내용 설명
이전에는 관리 코드 예외 처리기(예: C#에서 try-catch 문을 사용하여)가 손상된 프로세스 상태 예외를 catch하고 처리할 수 있었습니다.
.NET Core 1.0부터는 손상된 프로세스 상태 예외를 관리 코드로 처리할 수 없습니다. 공용 언어 런타임에서는 손상된 프로세스 상태 예외를 관리 코드에 제공하지 않습니다.
도입된 버전
1.0
권장 작업
대신 발생하는 상황을 해결하여 손상된 프로세스 상태 예외를 처리할 필요가 없습니다. 손상된 프로세스 상태 예외를 처리해야 하는 경우 예외 처리기를 C 또는 C++ 코드로 작성합니다.
범주
핵심 .NET 라이브러리
영향을 받는 API
- System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute
- legacyCorruptedStateExceptionsPolicy 요소
UriBuilder 속성은 더 이상 앞에 선행 문자를 추가하지 않음
UriBuilder.Fragment는 더 이상 앞에 선행 #
문자를 추가하지 않으며 UriBuilder.Query는 더 이상 앞에 선행 ?
문자를 추가하지 않습니다(해당 문자가 이미 있는 경우).
변경 내용 설명
.NET Framework에서 UriBuilder.Fragment 및 UriBuilder.Query 속성은 항상 저장되는 값 앞에 각각 #
또는 ?
문자를 추가합니다. 이 동작으로 인해 문자열에 이미 이 선행 문자 중 하나가 포함된 경우 저장된 값에 여러 #
또는 ?
문자가 생성될 수 있습니다. 예를 들어 UriBuilder.Fragment 값이 ##main
이 될 수 있습니다.
.NET Core 1.0부터 이 속성은 더 이상 저장된 값 앞에 #
또는 ?
문자를 추가하지 않습니다(해당 문자가 문자열의 시작 부분에 이미 있는 경우).
도입된 버전
1.0
권장 작업
속성 값을 설정할 때 더 이상 이 선행 문자를 명시적으로 제거할 필요가 없습니다. 더 이상 추가할 때마다 선행 #
또는 ?
를 제거할 필요가 없기 때문에 값을 추가할 경우 이 방법이 특히 유용합니다.
예를 들어 다음 코드 조각은 .NET Framework와 .NET Core의 동작 차이를 보여 줍니다.
var builder = new UriBuilder();
builder.Query = "one=1";
builder.Query += "&two=2";
builder.Query += "&three=3";
builder.Query += "&four=4";
Console.WriteLine(builder.Query);
- .NET Framework에서 출력은
????one=1&two=2&three=3&four=4
입니다. - .NET Core에서 출력은
?one=1&two=2&three=3&four=4
입니다.
범주
핵심 .NET 라이브러리
영향을 받는 API
Process.StartInfo는 코드가 시작하지 않은 프로세스에 대해 InvalidOperationException을 throw함
코드가 시작하지 않은 프로세스의 Process.StartInfo 속성을 읽으면 InvalidOperationException이 throw됩니다.
변경 내용 설명
.NET Framework에서는 코드가 시작하지 않은 프로세스의 Process.StartInfo 속성에 액세스하면 더미 ProcessStartInfo 개체가 반환됩니다. 더미 개체는 EnvironmentVariables를 제외하고 모든 속성에 대한 기본값을 포함합니다.
.NET Core 1.0부터 코드가 (Process.Start를 호출하여) 시작하지 않은 프로세스의 Process.StartInfo 속성을 읽는 경우 InvalidOperationException이 throw됩니다.
도입된 버전
1.0
권장 작업
코드가 시작하지 않은 프로세스의 Process.StartInfo 속성에 액세스하지 마세요. 예를 들어 Process.GetProcesses에서 반환하는 프로세스에 대해서는 이 속성을 읽지 마세요.
범주
핵심 .NET 라이브러리
영향을 받는 API
암호화
.NET Core 2.1
SignedCms.ComputeSignature의 부울 매개 변수를 적용
.NET Core에서 SignedCms.ComputeSignature(CmsSigner, Boolean) 메서드의 부울 silent
매개 변수가 적용됩니다. 이 매개 변수가 true
로 설정된 경우에는 PIN 프롬프트가 표시되지 않습니다.
변경 내용 설명
.NET Framework에서 SignedCms.ComputeSignature(CmsSigner, Boolean) 메서드의 silent
매개 변수는 무시되고 공급자에 필요한 경우 PIN 프롬프트가 항상 표시됩니다. .NET Core에서는 silent
매개 변수가 적용되며, true
로 설정된 경우 공급자에 필요한 경우에도 PIN 프롬프트가 표시되지 않습니다.
CMS/PKCS #7 메시지에 대한 지원은 .NET Core 버전 2.1에 도입되었습니다.
도입된 버전
2.1
권장 작업
필요한 경우 PIN 프롬프트가 표시되도록 하려면 데스크톱 애플리케이션에서 SignedCms.ComputeSignature(CmsSigner, Boolean)를 호출하고 부울 매개 변수를 false
로 설정해야 합니다. 자동 컨텍스트가 사용하지 않도록 설정되었는지 여부와 관계없이 결과 동작은 .NET Framework와 동일합니다.
범주
암호화
영향을 받는 API
MSBuild
.NET Core 3.0
리소스 매니페스트 파일 이름 변경
.NET Core 3.0부터 기본 사례에서 MSBuild는 리소스 파일에 대해 다른 매니페스트 파일 이름을 생성합니다.
도입된 버전
3.0
변경 내용 설명
.NET Core 3.0보다 이전 버전에서는 프로젝트 파일의 EmbeddedResource
항목에 대해 LogicalName
, ManifestResourceName
또는 DependentUpon
메타데이터가 지정되지 않은 경우 MSBuild는 <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources
패턴으로 매니페스트 파일 이름을 생성했습니다. 프로젝트 파일에 RootNamespace
가 정의되어 있지 않은 경우 기본적으로 프로젝트 이름으로 설정됩니다. 예를 들어, 루트 프로젝트 디렉터리의 Form1.resx라는 리소스 파일에 대해 생성된 매니페스트 이름은 MyProject.Form1.resources였습니다.
.NET Core 3.0부터 리소스 파일이 동일한 이름의 소스 파일과 공동 배치되는 경우(예: Form1.resx와 Form1.cs) MSBuild는 소스 파일의 형식 정보를 사용하여 <Namespace>.<ClassName>.resources
패턴으로 매니페스트 파일 이름을 생성합니다. 네임스페이스 및 클래스 이름은 공동 배치된 소스 파일의 첫 번째 형식에서 추출됩니다. 예를 들어 Form1.cs라는 소스 파일과 공동 배치된 Form1.resx라는 리소스 파일에 대해 생성된 매니페스트 이름은 MyNamespace.Form1.resources입니다. 중요한 점은 파일 이름의 첫 부분이 이전 버전의 .NET Core와 다르다는 것입니다(MyProject가 아니라 MyNamespace).
참고 항목
프로젝트 파일의 EmbeddedResource
항목에 LogicalName
, ManifestResourceName
또는 DependentUpon
메타데이터가 지정되어 있는 경우 이 변경 내용은 해당 리소스 파일에 영향을 주지 않습니다.
이 주요 변경 내용은 .NET Core 프로젝트에 EmbeddedResourceUseDependentUponConvention
속성을 추가하여 도입되었습니다. 기본적으로 리소스 파일은 .NET Core 프로젝트 파일에 명시적으로 나열되지 않으므로 생성된 .resources 파일의 이름을 지정하는 방법을 지정하는 DependentUpon
메타데이터가 없습니다. EmbeddedResourceUseDependentUponConvention
이 기본값 true
로 설정된 경우 MSBuild는 공동 배치된 소스 파일을 찾아 해당 파일에서 네임스페이스 및 클래스 이름을 추출합니다. EmbeddedResourceUseDependentUponConvention
을 false
로 설정하면 MSBuild는 이전 동작에 따라, 즉 RootNamespace
와 상대 파일 경로를 결합하여 매니페스트 이름을 생성합니다.
권장 작업
대부분의 경우 개발자에게는 아무 작업도 필요하지 않으며 앱은 계속 작동할 것입니다. 그러나 이 변경으로 앱이 중단되는 경우 다음 중 하나를 수행할 수 있습니다.
새 매니페스트 이름을 예상하도록 코드를 변경합니다.
프로젝트 파일에서
EmbeddedResourceUseDependentUponConvention
을false
로 설정하여 새 명명 규칙을 옵트아웃합니다.<PropertyGroup> <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention> </PropertyGroup>
범주
MSBuild
영향을 받는 API
해당 없음
네트워킹
.NET Core 2.0
WebClient.CancelAsync가 항상 즉시 취소되지는 않음
.NET Core 2.0부터 응답을 가져오기 시작한 경우 WebClient.CancelAsync()를 호출하면 요청이 즉시 취소되지 않습니다.
변경 내용 설명
이전에는 WebClient.CancelAsync()를 호출하면 요청이 즉시 취소되었습니다. .NET Core 2.0부터 응답을 가져오기 시작하지 않은 경우에만 WebClient.CancelAsync()를 호출하면 요청이 즉시 취소됩니다. 응답을 가져오기 시작한 경우에는 전체 응답을 읽은 후에만 요청이 취소됩니다.
WebClient API가 사용되지 않고 HttpClient로 대체되었기 때문에 이러한 변경이 구현되었습니다.
도입된 버전
2.0
권장 작업
더 이상 사용되지 않는 System.Net.WebClient 대신 System.Net.Http.HttpClient 클래스를 사용합니다.
범주
네트워킹
영향을 받는 API
Windows Forms
Windows Forms 지원이 버전 3.0의 .NET Core에 추가되었습니다. .NET Framework에서 .NET Core로 Windows Forms 앱을 마이그레이션하는 경우 여기에 나열된 주요 변경 사항이 앱에 영향을 줄 수 있습니다.
- 제거된 컨트롤
- 도구 설명이 표시되면 CellFormatting 이벤트가 발생하지 않음
- Control.DefaultFont가 맑은 고딕 9pt로 변경됨
- FolderBrowserDialog의 현대화
- 일부 Windows Forms 형식에서 SerializableAttribute 제거됨
- AllowUpdateChildControlIndexForTabControls 호환성 스위치가 지원되지 않음
- DomainUpDown.UseLegacyScrolling 호환성 스위치가 지원되지 않음
- DoNotLoadLatestRichEditControl 호환성 스위치가 지원되지 않음
- DoNotSupportSelectAllShortcutInMultilineTextBox 호환성 스위치가 지원되지 않음
- DontSupportReentrantFilterMessage 호환성 스위치가 지원되지 않음
- EnableVisualStyleValidation 호환성 스위치가 지원되지 않음
- UseLegacyContextMenuStripSourceControlValue 호환성 스위치가 지원되지 않음
- UseLegacyImages 호환성 스위치가 지원되지 않음
- Visual Basic에 대한 정보 및 SplashScreen 템플릿이 손상됨
- Microsoft.VisualBasic.ApplicationServices 네임스페이스의 형식을 사용할 수 없음
- Microsoft.VisualBasic.Devices 네임스페이스의 형식을 사용할 수 없음
- Microsoft.VisualBasic.MyServices 네임스페이스의 형식을 사용할 수 없음
.NET Core 3.1
제거된 컨트롤
.NET Core 3.1부터 일부 Windows Forms 컨트롤을 더 이상 사용할 수 없습니다.
변경 내용 설명
.NET Core 3.1부터 다양한 Windows Forms 컨트롤을 더 이상 사용할 수 없습니다. 향상된 디자인 및 지원을 제공하는 대체 컨트롤이 .NET Framework 2.0에 도입되었습니다. 사용되지 않는 컨트롤은 이전에 디자이너 도구 상자에서 제거되었지만, 여전히 사용할 수 있습니다.
다음 형식은 더 이상 사용할 수 없습니다.
- ContextMenu
- DataGrid
- DataGrid.HitTestType
- DataGridBoolColumn
- DataGridCell
- DataGridColumnStyle
- DataGridLineStyle
- DataGridParentRowsLabelStyle
- DataGridPreferredColumnWidthTypeConverter
- DataGridTableStyle
- DataGridTextBox
- DataGridTextBoxColumn
- GridColumnStylesCollection
- GridTablesFactory
- GridTableStylesCollection
- IDataGridEditingService
- IMenuEditorService
- MainMenu
- Menu
- Menu.MenuItemCollection
- MenuItem
- ToolBar
- ToolBarAppearance
- ToolBarButton
- ToolBar.ToolBarButtonCollection
- ToolBarButtonClickEventArgs
- ToolBarButtonStyle
- ToolBarTextAlign
도입된 버전
3.1
권장 작업
제거된 각 컨트롤에는 권장되는 대체 컨트롤이 있습니다. 다음 표를 참조하세요.
제거된 컨트롤(API) | 권장된 대체 | 제거된 연결 API |
---|---|---|
ContextMenu | ContextMenuStrip | |
DataGrid | DataGridView | DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType |
MainMenu | MenuStrip | |
메뉴 | ToolStripDropDown, ToolStripDropDownMenu | MenuItemCollection |
MenuItem | ToolStripMenuItem | |
ToolBar | ToolStrip | ToolBarAppearance |
ToolBarButton | ToolStripButton | ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign |
범주
Windows Forms
영향을 받는 API
- System.Windows.Forms.ContextMenu
- System.Windows.Forms.GridColumnStylesCollection
- System.Windows.Forms.GridTablesFactory
- System.Windows.Forms.GridTableStylesCollection
- System.Windows.Forms.IDataGridEditingService
- System.Windows.Forms.MainMenu
- System.Windows.Forms.Menu
- System.Windows.Forms.Menu.MenuItemCollection
- System.Windows.Forms.MenuItem
- System.Windows.Forms.ToolBar
- System.Windows.Forms.ToolBar.ToolBarButtonCollection
- System.Windows.Forms.ToolBarAppearance
- System.Windows.Forms.ToolBarButton
- System.Windows.Forms.ToolBarButtonClickEventArgs
- System.Windows.Forms.ToolBarButtonStyle
- System.Windows.Forms.ToolBarTextAlign
- System.Windows.Forms.DataGrid
- System.Windows.Forms.DataGrid.HitTestType
- System.Windows.Forms.DataGridBoolColumn
- System.Windows.Forms.DataGridCell
- System.Windows.Forms.DataGridColumnStyle
- System.Windows.Forms.DataGridLineStyle
- System.Windows.Forms.DataGridParentRowsLabelStyle
- System.Windows.Forms.DataGridPreferredColumnWidthTypeConverter
- System.Windows.Forms.DataGridTableStyle
- System.Windows.Forms.DataGridTextBox
- System.Windows.Forms.DataGridTextBoxColumn
- System.Windows.Forms.Design.IMenuEditorService
도구 설명이 표시되면 CellFormatting 이벤트가 발생하지 않음
이제 마우스로 가리키는 경우와 키보드를 통해 선택하는 경우 DataGridView에 셀 텍스트 및 오류의 도구 설명이 표시됩니다. 도구 설명이 표시되는 경우 DataGridView.CellFormatting 이벤트는 발생하지 않습니다.
변경 내용 설명
.NET Core 3.1 이전에는, 셀을 마우스로 가리킬 때 ShowCellToolTips 속성이 true
(으)로 설정된 DataGridView에서 셀 텍스트 및 오류에 대한 도구 설명이 표시되었습니다. 키보드에서 셀을 선택한 경우(예: Tab 키, 바로 가기 키 또는 화살표 탐색 사용) 도구 설명이 표시되지 않았습니다. 사용자가 셀을 편집한 후 DataGridView이(가) 아직 편집 모드 상태인 동안 ToolTipText 속성이 설정되지 않은 셀을 마우스로 가리키는 경우, CellFormatting 이벤트가 발생하여 셀에 표시할 셀 텍스트의 서식을 지정합니다.
.NET Core 3.1부터 접근성 표준을 충족하기 위해, ShowCellToolTips 속성이 true
(으)로 설정된 DataGridView에서 셀을 가리킬 때뿐 아니라, 키보드에서 선택한 경우에도 셀 텍스트 및 오류의 도구 설명이 표시됩니다. 이 변경으로 인해 DataGridView이(가) 편집 모드에 있는 동안 ToolTipText 속성이 설정되지 않은 셀을 가리키는 경우에는 CellFormatting 이벤트가 발생되지 않습니다. 가리킨 셀의 내용이 셀에 표시되지 않고 도구 설명으로 표시되므로 이 이벤트가 발생하지 않습니다.
도입된 버전
3.1
권장 작업
DataGridView이(가) 편집 모드에 있는 동안 CellFormatting 이벤트에 종속된 모든 코드를 리팩터링합니다.
범주
Windows Forms
영향을 받는 API
없음
.NET Core 3.0
기본 컨트롤 글꼴이 맑은 고딕 9pt로 변경되었습니다.
변경 내용 설명
.NET Framework에서는 Control.DefaultFont 속성이 Microsoft Sans Serif 8.25 pt
로 설정되었습니다. 다음 이미지에서는 기본 글꼴을 사용하는 창을 보여 줍니다.
.NET Core 3.0부터 기본 글꼴은 Segoe UI 9 pt
(SystemFonts.MessageBoxFont과 동일한 글꼴)으로 설정됩니다. 이 변경으로 인해 양식 및 컨트롤의 크기가 새 기본 글꼴의 더 큰 크기를 고려하여 약 27% 커졌습니다. 예시:
이 변경은 Windows 사용자 환경(UX) 지침에 맞게 변경되었습니다.
도입된 버전
3.0
권장 작업
양식 및 컨트롤의 크기가 변경되므로 애플리케이션이 올바르게 렌더링되는지 확인합니다.
단일 양식의 원래 글꼴을 보존하려면 기본 글꼴을 Microsoft Sans Serif 8.25 pt
로 설정합니다. 예시:
public MyForm()
{
InitializeComponent();
Font = new Font(new FontFamily("Microsoft Sans Serif"), 8.25f);
}
또는 다음 방법 중 하나로 전체 애플리케이션의 기본 글꼴을 변경할 수 있습니다.
ApplicationDefaultFont
MSBuild 속성을 "Microsoft Sans Serif, 8.25pt"로 설정합니다. 이는 Visual Studio가 디자이너의 새 설정을 사용할 수 있도록 하기 때문에 기본 설정되는 기술입니다.<PropertyGroup> <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont> </PropertyGroup>
Application.SetDefaultFont(Font)를 호출합니다.
class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.SetDefaultFont(new Font(new FontFamily("Microsoft Sans Serif"), 8.25f)); Application.Run(new Form1()); } }
범주
- Windows Forms
영향을 받는 API
없음
FolderBrowserDialog의 현대화
이 FolderBrowserDialog 컨트롤은 .NET Core 용 Windows Forms 애플리케이션에서 변경되었습니다.
변경 내용 설명
.NET Framework에서 Windows Forms는 FolderBrowserDialog 컨트롤에 대해 다음 대화 상자를 사용합니다.
.NET Core 3.0에서는 Windows Forms가 Windows Vista에서 도입된 최신 COM 기반 컨트롤을 사용합니다.
도입된 버전
3.0
권장 작업
대화 상자가 자동으로 업그레이드됩니다.
원래 대화 상자를 유지하려는 경우 다음 코드 조각에 나와 있듯이 대화 상자를 표시하기 전에 FolderBrowserDialog.AutoUpgradeEnabled 속성을 false
로 설정합니다.
var dialog = new FolderBrowserDialog();
dialog.AutoUpgradeEnabled = false;
dialog.ShowDialog();
범주
Windows Forms
영향을 받는 API
일부 Windows Forms 형식에서 SerializableAttribute 제거됨
알려진 이진 serialization 시나리오가 없는 일부 Windows Forms 클래스에서 SerializableAttribute가 제거되었습니다.
변경 내용 설명
.NET Framework에서는 다음 형식이 SerializableAttribute로 데코레이트되지만, .NET Core에서는 이 특성이 제거되었습니다.
System.InvariantComparer
- System.ComponentModel.Design.ExceptionCollection
- System.ComponentModel.Design.Serialization.CodeDomSerializerException
System.ComponentModel.Design.Serialization.CodeDomComponentSerializationService.CodeDomSerializationStore
- System.Drawing.Design.ToolboxItem
System.Resources.ResXNullRef
System.Resources.ResXDataNode
System.Resources.ResXFileRef
- System.Windows.Forms.Cursor
System.Windows.Forms.NativeMethods.MSOCRINFOSTRUCT
System.Windows.Forms.NativeMethods.MSG
지금까지 이 serialization 메커니즘의 유지 관리 및 보안과 관련된 우려 사항이 많았습니다. 형식의 SerializableAttribute
를 유지 관리하려면, 버전 간 serialization 변경 및 잠재적인 프레임워크 간 serialization 변경에 대해 해당 형식을 테스트해야 합니다. 따라서 이러한 형식의 발전이 더 어려워지며, 유지 관리 비용이 많이 들 수 있습니다. 이 형식에는 알려진 이진 serialization 시나리오가 없으므로, 특성 제거로 인한 영향이 최소화됩니다.
자세한 내용은 이진 Serialization을 참조하세요.
도입된 버전
3.0
권장 작업
이러한 형식이 직렬화 가능으로 표시되어야 하는 코드를 모두 업데이트합니다.
범주
Windows Forms
영향을 받는 API
- 없음
AllowUpdateChildControlIndexForTabControls 호환성 스위치가 지원되지 않음
Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
호환성 스위치는 .NET Framework 4.6 이상 버전의 Windows Forms에서 지원되지만, .NET Core 또는 .NET 5.0 이상에서는 지원되지 않습니다.
변경 내용 설명
.NET Framework 4.6 이상 버전에서 탭을 선택하면 해당 컨트롤 컬렉션이 다시 정렬됩니다. 이 동작을 사용하지 않으려는 경우, Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
호환성 스위치를 통해 애플리케이션에서 다시 정렬을 건너뛸 수 있습니다.
.NET Core 및 .NET 5.0 이상에서는 Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
스위치가 지원되지 않습니다.
도입된 버전
3.0
권장 작업
스위치를 제거합니다. 이 스위치는 지원되지 않으며, 사용 가능한 대체 기능이 없습니다.
범주
Windows Forms
영향을 받는 API
- 없음
DomainUpDown.UseLegacyScrolling 호환성 스위치가 지원되지 않음
.NET Framework 4.7.1에서 도입된 Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
호환성 스위치는 .NET Core 또는 .NET 5.0 이상의 Windows Forms에서 지원되지 않습니다.
변경 내용 설명
.NET Framework 4.7.1부터는 개발자가 Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
호환성 스위치를 통해 독립적인 DomainUpDown.DownButton() 및 DomainUpDown.UpButton() 작업을 옵트아웃할 수 있었습니다. 이 스위치는 컨텍스트 텍스트가 있는 경우 DomainUpDown.UpButton()이 무시되고, 개발자가 컨트롤에서 DomainUpDown.DownButton() 작업을 DomainUpDown.UpButton() 작업 전에 사용해야 하는 레거시 동작을 복원했습니다. 자세한 내용은 <AppContextSwitchOverrides> 요소를 참조하세요.
.NET Core 및 .NET 5.0 이상에서는 Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
스위치가 지원되지 않습니다.
도입된 버전
3.0
권장 작업
스위치를 제거합니다. 이 스위치는 지원되지 않으며, 사용 가능한 대체 기능이 없습니다.
범주
Windows Forms
영향을 받는 API
DoNotLoadLatestRichEditControl 호환성 스위치가 지원되지 않음
.NET Framework 4.7.1에서 도입된 Switch.System.Windows.Forms.UseLegacyImages
호환성 스위치는 .NET Core 또는 .NET 5.0 이상의 Windows Forms에서 지원되지 않습니다.
변경 내용 설명
.NET Framework 4.6.2 및 이전 버전에서는 RichTextBox 컨트롤이 Win32 RichEdit 컨트롤 v3.0을 인스턴스화하고, .NET Framework 4.7.1을 대상으로 하는 애플리케이션의 경우 RichTextBox 컨트롤이 msftedit.dll에서 RichEdit v4.1을 인스턴스화합니다. Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl
호환성 스위치는 .NET Framework 4.7.1 이상 버전을 대상으로 하는 애플리케이션이 새 RichEdit v4.1 컨트롤을 옵트아웃하고 이전 RichEdit v3 컨트롤을 대신 사용할 수 있도록 하기 위해 도입되었습니다.
.NET Core 및 .NET 5.0 이상 버전에서는 Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl
스위치가 지원되지 않습니다. 새 버전의 RichTextBox 컨트롤만 지원됩니다.
도입된 버전
3.0
권장 작업
스위치를 제거합니다. 이 스위치는 지원되지 않으며, 사용 가능한 대체 기능이 없습니다.
범주
Windows Forms
영향을 받는 API
DoNotSupportSelectAllShortcutInMultilineTextBox 호환성 스위치가 지원되지 않음
.NET Framework 4.6.1에서 도입된 Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
호환성 스위치는 .NET Core 및 .NET 5.0 이상의 Windows Forms에서 지원되지 않습니다.
변경 내용 설명
.NET Framework 4.6.1부터 TextBox 컨트롤에서 Ctrl + A 바로 가기 키를 선택하면 모든 텍스트가 선택되었습니다. .NET Framework 4.6 및 이전 버전에서는 Textbox.ShortcutsEnabled 및 TextBox.Multiline 속성이 모두 true
로 설정된 경우, Ctrl + A 바로 가기 키를 선택해도 모든 텍스트가 선택되지 않았습니다. Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
호환성 스위치는 원래 동작을 유지하기 위해 .NET Framework 4.6.1에서 도입되었습니다. 자세한 내용은 TextBox.ProcessCmdKey을 참조하세요.
.NET Core 및 .NET 5.0 이상 버전에서는 Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
스위치가 지원되지 않습니다.
도입된 버전
3.0
권장 작업
스위치를 제거합니다. 이 스위치는 지원되지 않으며, 사용 가능한 대체 기능이 없습니다.
범주
Windows Forms
영향을 받는 API
- 없음
DontSupportReentrantFilterMessage 호환성 스위치가 지원되지 않음
.NET Framework 4.6.1에서 도입된 Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
호환성 스위치는 .NET Core 및 .NET 5.0 이상의 Windows Forms에서 지원되지 않습니다.
변경 내용 설명
.NET Framework 4.6.1부터는 사용자 지정 IMessageFilter.PreFilterMessage 구현으로 Application.FilterMessage 메시지를 호출할 때 Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
호환성 스위치가 가능한 IndexOutOfRangeException 예외를 해결합니다. 자세한 내용은 완화: 사용자 지정 IMessageFilter.PreFilterMessage 구현을 참조하십시오.
.NET Core 및 .NET 5.0 이상에서는 Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
스위치가 지원되지 않습니다.
도입된 버전
3.0
권장 작업
스위치를 제거합니다. 이 스위치는 지원되지 않으며, 사용 가능한 대체 기능이 없습니다.
범주
Windows Forms
영향을 받는 API
EnableVisualStyleValidation 호환성 스위치가 지원되지 않음
Switch.System.Windows.Forms.EnableVisualStyleValidation
호환성 스위치는 .NET Core 또는 .NET 5.0 이상의 Windows Forms에서 지원되지 않습니다.
변경 내용 설명
.NET Framework에서는 애플리케이션이 Switch.System.Windows.Forms.EnableVisualStyleValidation
호환성 스위치를 통해 숫자 형태로 제공된 시각적 개체 스타일의 유효성 검사를 옵트아웃할 수 있었습니다.
.NET Core 및 .NET 5.0 이상에서는 Switch.System.Windows.Forms.EnableVisualStyleValidation
스위치가 지원되지 않습니다.
도입된 버전
3.0
권장 작업
스위치를 제거합니다. 이 스위치는 지원되지 않으며, 사용 가능한 대체 기능이 없습니다.
범주
Windows Forms
영향을 받는 API
- 없음
UseLegacyContextMenuStripSourceControlValue 호환성 스위치가 지원되지 않음
.NET Framework 4.7.2에서 도입된 Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
호환성 스위치는 .NET Core 또는 .NET 5.0 이상의 Windows Forms에서 지원되지 않습니다.
변경 내용 설명
.NET Framework 4.7.2부터는 개발자가 Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
호환성 스위치를 통해 소스 제어에 대한 참조를 반환하는 ContextMenuStrip.SourceControl 속성의 새 동작을 옵트아웃할 수 있습니다. 이 속성의 이전 동작은 null
을 반환하는 것이었습니다. 자세한 내용은 <AppContextSwitchOverrides> 요소를 참조하세요.
.NET Core 및 .NET 5.0 이상에서는 Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
스위치가 지원되지 않습니다.
도입된 버전
3.0
권장 작업
스위치를 제거합니다. 이 스위치는 지원되지 않으며, 사용 가능한 대체 기능이 없습니다.
범주
Windows Forms
영향을 받는 API
UseLegacyImages 호환성 스위치가 지원되지 않음
.NET Framework 4.8에서 도입된 Switch.System.Windows.Forms.UseLegacyImages
호환성 스위치는 .NET Core 또는 .NET 5.0의 Windows Forms에서 지원되지 않습니다.
변경 내용 설명
.NET Framework 4.8부터는 Switch.System.Windows.Forms.UseLegacyImages
호환성 스위치가 높은 DPI 환경의 ClickOnce 시나리오에서 가능한 이미지 크기 조정 문제를 해결했습니다. true
로 설정하면, 사용자가 이 스위치를 통해 배율이 100%보다 큰 값으로 설정된 높은 DPI 디스플레이에서 레거시 이미지 크기 조정을 복원할 수 있습니다. 자세한 내용은 GitHub에서 .NET Framework 4.8 릴리스 정보를 참조하세요.
.NET Core 및 .NET 5.0 이상에서는 Switch.System.Windows.Forms.UseLegacyImages
스위치가 지원되지 않습니다.
도입된 버전
3.0
권장 작업
스위치를 제거합니다. 이 스위치는 지원되지 않으며, 사용 가능한 대체 기능이 없습니다.
범주
Windows Forms
영향을 받는 API
- 없음
About 및 SplashScreen 템플릿이 손상됨
Visual Studio에서 생성된 About.vb
및 SplashScreen.vb
파일에는 .NET Core 3.0 및 3.1에서 사용할 수 없는 My
네임스페이스의 형식에 대한 참조가 포함되어 있습니다.
도입된 버전
3.0
변경 내용 설명
.NET Core 3.0 및 3.1에는 전체 Visual Basic My
지원이 포함되지 않습니다. Visual Basic Windows Forms 앱용 Visual Studio의 About 및 SplashScreen 양식 템플릿은 사용할 수 없는 My.Application.Info
형식의 속성을 참조합니다.
권장 작업
.NET 5에서 Visual Basic My
지원이 개선되었으며 프로젝트를 .NET 5 이상으로 업그레이드했습니다.
또는
앱의 About 및 SplashScreen 형식에서 컴파일러 오류를 수정합니다. System.Reflection.Assembly
클래스를 사용하여 My.Application.Info
형식에서 제공하는 정보를 가져옵니다. 두 양식의 직선 포트는 여기에서 사용할 수 있습니다.
팁
이 코드는 샘플 코드이며 최적화되지 않았습니다. 양식 로드 시간을 줄이기 위해 특성 목록을 캐시해야 합니다.
정보
Imports System.Reflection
Public NotInheritable Class About
Private Sub about_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Set the title of the form.
Dim applicationTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title
If String.IsNullOrEmpty(applicationTitle) Then
applicationTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
End If
Me.Text = String.Format("About {0}", applicationTitle)
' Initialize all of the text displayed on the About Box.
' TODO: Customize the application's assembly information in the "Application" pane of the project
' properties dialog (under the "Project" menu).
Me.LabelProductName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyProductAttribute)()?.Product, "")
Me.LabelVersion.Text = String.Format("Version {0}", Assembly.GetExecutingAssembly().GetName().Version)
Me.LabelCopyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
Me.LabelCompanyName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCompanyAttribute)()?.Company, "")
Me.TextBoxDescription.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyDescriptionAttribute)()?.Description, "")
End Sub
Private Sub OKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OKButton.Click
Me.Close()
End Sub
End Class
SplashScreen
Imports System.Reflection
Public NotInheritable Class SplashScreen
Private Sub SplashScreen1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'Set up the dialog text at runtime according to the application's assembly information.
'TODO: Customize the application's assembly information in the "Application" pane of the project
' properties dialog (under the "Project" menu).
'Application title
Dim appTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title
If String.IsNullOrEmpty(appTitle) Then
appTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
End If
ApplicationTitle.Text = appTitle
Dim versionValue = Assembly.GetExecutingAssembly().GetName().Version
'Format the version information using the text set into the Version control at design time as the
' formatting string. This allows for effective localization if desired.
' Build and revision information could be included by using the following code and changing the
' Version control's designtime text to "Version {0}.{1:00}.{2}.{3}" or something similar. See
' String.Format() in Help for more information.
'
' Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor, versionValue.Build, versionValue.Revision)
Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor)
'Copyright info
Copyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
End Sub
End Class
범주
Visual Basic Windows Forms
영향을 받는 API
없음
Microsoft.VisualBasic.ApplicationServices 네임스페이스의 형식을 사용할 수 없음
Microsoft.VisualBasic.ApplicationServices 네임스페이스의 형식을 사용할 수 없습니다.
도입된 버전
.NET Core 3.0
변경 내용 설명
Microsoft.VisualBasic.ApplicationServices 네임스페이스의 형식은 .NET Framework에서 사용할 수 있습니다. .NET Core 3.0~3.1에서는 사용할 수 없습니다.
후속 릴리스에서 불필요한 어셈블리 종속성이나 호환성이 손상되는 변경을 방지하기 위해 형식을 제거했습니다.
권장 작업
이 네임스페이스는 .NET 5에서 추가되었으며 프로젝트를 .NET 5 이상으로 업그레이드합니다.
또는
코드에서 Microsoft.VisualBasic.ApplicationServices 형식과 해당 멤버를 사용해야 하는 경우, .NET 클래스 라이브러리의 해당 형식이나 멤버를 사용할 수 있습니다. 예를 들어 System.Environment 및 System.Security.Principal.WindowsIdentity의 일부 멤버는 Microsoft.VisualBasic.ApplicationServices.User 클래스의 속성과 동등한 기능을 제공합니다.
범주
Visual Basic
영향을 받는 API
Microsoft.VisualBasic.Devices 네임스페이스의 형식을 사용할 수 없음
Microsoft.VisualBasic.Devices 네임스페이스의 형식을 사용할 수 없습니다.
도입된 버전
.NET Core 3.0
변경 내용 설명
Microsoft.VisualBasic.Devices 네임스페이스의 형식은 .NET Framework에서 사용할 수 있습니다. .NET Core 3.0~3.1에서는 사용할 수 없습니다.
후속 릴리스에서 불필요한 어셈블리 종속성이나 호환성이 손상되는 변경을 방지하기 위해 형식을 제거했습니다.
권장 작업
이 네임스페이스는 .NET 5에서 추가되었으며 프로젝트를 .NET 5 이상으로 업그레이드합니다.
또는
코드에서 Microsoft.VisualBasic.Devices 형식과 해당 멤버를 사용해야 하는 경우, .NET 클래스 라이브러리의 해당 형식이나 멤버를 사용할 수 있습니다. 예를 들어 Microsoft.VisualBasic.Devices.Clock 클래스와 동등한 기능은 System.DateTime 및 System.Environment 형식에서 제공되고, Microsoft.VisualBasic.Devices.Ports 클래스와 동등한 기능은 System.IO.Ports 네임스페이스의 형식에서 제공됩니다.
범주
Visual Basic
영향을 받는 API
Microsoft.VisualBasic.MyServices 네임스페이스의 형식을 사용할 수 없음
Microsoft.VisualBasic.MyServices 네임스페이스의 형식을 사용할 수 없습니다.
도입된 버전
.NET Core 3.0
변경 내용 설명
Microsoft.VisualBasic.MyServices 네임스페이스의 형식은 .NET Framework에서 사용할 수 있습니다. .NET Core 3.0~3.1에서는 사용할 수 없습니다.
후속 릴리스에서 불필요한 어셈블리 종속성이나 호환성이 손상되는 변경을 방지하기 위해 형식을 제거했습니다.
권장 작업
이 네임스페이스는 .NET 5에서 추가되었으며 프로젝트를 .NET 5 이상으로 업그레이드합니다.
또는
코드에서 Microsoft.VisualBasic.MyServices 형식과 해당 멤버를 사용해야 하는 경우, .NET 클래스 라이브러리에 해당 형식과 멤버가 있습니다. Microsoft.VisualBasic.MyServices 형식과 동등한 .NET 클래스 라이브러리 형식의 매핑은 다음과 같습니다.
Microsoft.VisualBasic.MyServices 형식 | .NET 클래스 라이브러리 형식 |
---|---|
ClipboardProxy | WPF 애플리케이션의 경우 System.Windows.Clipboard, Windows Forms 애플리케이션의 경우 System.Windows.Forms.Clipboard |
FileSystemProxy | System.IO 네임스페이스의 형식 |
RegistryProxy | Microsoft.Win32 네임스페이스의 레지스트리 관련 형식 |
SpecialDirectoriesProxy | Environment.GetFolderPath |
범주
Visual Basic
영향을 받는 API
참고 항목
.NET
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기