Share via


.NET Core 3.0 및 3.1용 Windows Forms의 호환성이 손상되는 변경

Windows Forms 지원이 버전 3.0의 .NET Core에 추가되었습니다. 이 문서에서는 Windows Forms의 호환성이 손상되는 변경을 .NET 버전(해당 변경이 도입된 버전)을 기준으로 나열합니다. .NET Framework 또는 이전 버전의 .NET Core(3.0 이상)에서 Windows Forms 앱을 업그레이드하는 경우 이 문서가 적용됩니다.

이 페이지에는 다음과 같은 주요 변경 사항이 설명되어 있습니다.

주요 변경 내용 도입된 버전
제거된 컨트롤 3.1
도구 설명이 표시되면 CellFormatting 이벤트가 발생하지 않음 3.1
Control.DefaultFont가 맑은 고딕 9pt로 변경됨 3.0
FolderBrowserDialog의 현대화 3.0
일부 Windows Forms 형식에서 SerializableAttribute 제거됨 3.0
AllowUpdateChildControlIndexForTabControls 호환성 스위치가 지원되지 않음 3.0
DomainUpDown.UseLegacyScrolling 호환성 스위치가 지원되지 않음 3.0
DoNotLoadLatestRichEditControl 호환성 스위치가 지원되지 않음 3.0
DoNotSupportSelectAllShortcutInMultilineTextBox 호환성 스위치가 지원되지 않음 3.0
DontSupportReentrantFilterMessage 호환성 스위치가 지원되지 않음 3.0
EnableVisualStyleValidation 호환성 스위치가 지원되지 않음 3.0
UseLegacyContextMenuStripSourceControlValue 호환성 스위치가 지원되지 않음 3.0
UseLegacyImages 호환성 스위치가 지원되지 않음 3.0
Visual Basic에 대한 정보 및 SplashScreen 템플릿이 손상됨 3.0

.NET Core 3.1

제거된 컨트롤

.NET Core 3.1부터 일부 Windows Forms 컨트롤을 더 이상 사용할 수 없습니다.

변경 내용 설명

.NET Core 3.1부터 다양한 Windows Forms 컨트롤을 더 이상 사용할 수 없습니다. 향상된 디자인 및 지원을 제공하는 대체 컨트롤이 .NET Framework 2.0에 도입되었습니다. 사용되지 않는 컨트롤은 이전에 디자이너 도구 상자에서 제거되었지만, 여전히 사용할 수 있습니다.

다음 형식은 더 이상 사용할 수 없습니다.

도입된 버전

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


도구 설명이 표시되면 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 Framework의 기본 컨트롤 글꼴

.NET Core 3.0부터 기본 글꼴은 Segoe UI 9 pt(SystemFonts.MessageBoxFont과 동일한 글꼴)으로 설정됩니다. 이 변경으로 인해 양식 및 컨트롤의 크기가 새 기본 글꼴의 더 큰 크기를 고려하여 약 27% 커졌습니다. 예시:

.NET Core의 기본 컨트롤 글꼴

이 변경은 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 Framework의 FolderBrowserDialogControl

.NET Core 3.0에서는 Windows Forms가 Windows Vista에서 도입된 최신 COM 기반 컨트롤을 사용합니다.

.NET Core의 FolderBrowserDialogControl

도입된 버전

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에서는 이 특성이 제거되었습니다.

지금까지 이 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.ShortcutsEnabledTextBox.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.vbSplashScreen.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의 AboutSplashScreen 양식 템플릿은 사용할 수 없는 My.Application.Info 형식의 속성을 참조합니다.

.NET 5에서 Visual Basic My 지원이 개선되었으며 프로젝트를 .NET 5 이상으로 업그레이드했습니다.

또는

앱의 AboutSplashScreen 형식에서 컴파일러 오류를 수정합니다. 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

없음


참고 항목