다음을 통해 공유


.NET용 Windows Forms 9의 새로운 기능

이 문서에서는 .NET 9용 Windows Forms의 새로운 기능들을 설명합니다.

비동기 양식

Important

이 기능 집합은 Control.InvokeAsync제외하고 실험적입니다.

최신 앱에는 비동기 통신 모델이 필요합니다. .NET에서 Windows Forms가 증가함에 따라 더 많은 구성 요소를 UI 스레드에서 실행하려면 async 메서드로 마샬링해야 합니다. 예를 들어 WebView2, 네이티브 Windows 10 및 Windows 11 API와 같은 컨트롤 또는 의미 체계 커널과 같은 최신 비동기 라이브러리가 있습니다. 또 다른 시나리오는 WPF, WinUI 또는 .NET MAUI와 같은 다른 UI 스택에서 Windows Forms를 사용하여 빌드된 async MVVM ViewModel을 공유하는 것입니다.

비동기 시나리오를 지원하기 위해 추가된 새 메서드 목록은 다음과 같습니다.

이 API는 실험적이므로 컴파일러 오류 뒤에 보호됩니다. 오류를 표시하지 않으며 API에 대한 액세스를 사용하도록 설정하려면 프로젝트 파일에 다음 PropertyGroup 을 추가합니다.

<PropertyGroup>
    <NoWarn>$(NoWarn);WFO5002</NoWarn>
</PropertyGroup>

BinaryFormatter가 더 이상 지원되지 않음

BinaryFormatter 은 역직렬화 공격에 취약하여 DoS(서비스 거부), 정보 공개 또는 원격 코드 실행으로 이어질 수 있으므로 안전하지 않은 것으로 간주됩니다. 역직렬화 취약성이 잘 이해되기 전에 구현되었으며 디자인은 최신 보안 모범 사례를 따르지 않습니다.

.NET 9부터 이러한 보안 위험을 방지하기 위해 구현이 제거되었습니다. 사용되는 경우 BinaryFormatter 예외가 PlatformNotSupportedException throw됩니다.

Windows Forms는 클립보드 및 끌어서 놓기 작업을 위해 데이터를 직렬화하는 경우와 같은 많은 시나리오에서 사용 BinaryFormatter 되며, 가장 중요한 것은 Windows Forms 디자이너입니다. 내부적으로 Windows Forms는 알려진 형식 집합으로 특정 사용 사례를 처리하기 위해 더 안전한 하위 집합 BinaryFormatter 을 계속 사용합니다.

.NET 9용 Windows Forms는 이진 serialization에 무의식적으로 참여하는 시간을 식별하는 데 도움이 되는 분석기와 함께 제공됩니다.

자세한 BinaryFormatter내용은 BinaryFormatter에 대한 Windows Forms 마이그레이션 가이드를 참조 하세요.

어둡게 모드

Important

이 기능 집합은 실험적입니다.

.NET 10에서 지원을 완료하는 것을 목표로 어두운 모드에 대한 예비 지원이 Windows Forms에 추가되었습니다. 색 모드가 변경 SystemColors 되면 일치하도록 변경됩니다. 앱의 색 모드는 다음 값 중 하나로 설정할 수 있습니다.

  • SystemColorMode.Classic-(기본값) 이전 버전의 Windows Forms와 동일한 라이트 모드입니다.
  • SystemColorMode.System- Windows에서 설정한 밝기 또는 어둡게 모드를 준수합니다.
  • SystemColorMode.Dark- 어둡게 모드를 사용합니다.

색 모드를 적용하려면 프로그램 시작 코드를 호출 Application.SetColorMode(SystemColorMode) 합니다.

namespace MyExampleProject;

static class Program
{
    /// <summary>
    ///  The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        // To customize application configuration such as set high DPI settings or default font,
        // see https://aka.ms/applicationconfiguration.
        ApplicationConfiguration.Initialize();
        Application.SetColorMode(SystemColorMode.Dark);
        Application.Run(new Form1());
    }    
}
Friend Module Program

    <STAThread()>
    Friend Sub Main(args As String())
        Application.SetHighDpiMode(HighDpiMode.SystemAware)
        Application.EnableVisualStyles()
        Application.SetCompatibleTextRenderingDefault(False)
        Application.SetColorMode(SystemColorMode.Dark)
        Application.Run(New Form1)
    End Sub

End Module

이 API는 실험적이므로 컴파일러 오류 뒤에 보호됩니다. 오류를 표시하지 않으며 API에 대한 액세스를 사용하도록 설정하려면 프로젝트 파일에 다음 PropertyGroup 을 추가합니다.

<PropertyGroup>
    <NoWarn>$(NoWarn);WFO5001</NoWarn>
</PropertyGroup>

FolderBrowserDialog의 향상된 기능

FolderBrowserDialog 이제 배열에 저장된 SelectedPaths 여러 폴더 선택을 지원합니다. 여러 폴더를 사용하도록 설정하려면 .로 Multiselect설정합니다true.

System.Drawing 새로운 기능 및 향상된 기능

System.Drawing 라이브러리에는 GDI+ 효과 래핑, 지원 ReadOnlySpan및 더 나은 interop 코드 생성을 포함하여 많은 개선 사항이 있었습니다.

System.Drawing은 GDI+ 효과를 지원합니다.

이제 System.Drawing 라이브러리는 흐리게 및 색조와 같은 GDI+ 비트맵 효과를 지원합니다. 효과는 GDI+의 일부였지만 지금까지 System.Drawing을 통해 노출되지 않았습니다.

효과는 메서드를 Bitmap 호출하여 적용됩니다 Bitmap.ApplyEffect(Effect, Rectangle) . 효과를 적용할 영역에 대한 효과와 선택 사항을 Rectangle 제공합니다. 전체 이미지를 처리하는 데 사용합니다 Rectangle.Empty .

System.Drawing.Imaging.Effects 네임스페이스에 적용할 수 있는 효과가 포함됩니다.

System.Drawing에서 Span을 지원합니다.

배열을 수락하는 많은 메서드도 수락 ReadOnlySpan하도록 향상되었습니다. 예를 들어 , 및 와 GraphicsPath.AddLines(ReadOnlySpan<Point>)Graphics.DrawLines(Pen, ReadOnlySpan<Point>)같은 DrawPolygon(Pen, ReadOnlySpan<Point>)메서드는 배열 또는 ReadOnlySpan.

interop에 CsWin32 사용

모든 interop 코드는 C# P/Invoke 소스 생성기인 CsWin32로 대체되었습니다.

ToolStrip

및 컨트롤에 ToolStripToolStripItem 다음과 같은 개선 사항이 추가되었습니다.

  • 에 새 속성이 추가ToolStripAllowClickThrough되었습니다.

    설정 true하면 폼에 초점을 맞추지 않는 동안 컨트롤과 상호 작용할 수 있습니다.

.NET Core 3.1이 릴리스되었을 때와 같은 MenuMainMenu모든 MenuItem관련 컨트롤이 제거되었습니다. ToolStrip 대신 ToolStripMenuItem 사용해야 합니다. 그러나 ToolStripItem기본 클래스 ToolStripMenuItem는 이벤트를 대체 MenuItem.Select 하지 않았습니다. 이 이벤트는 마우스 또는 키보드를 사용하여 항목을 강조 표시할 때 발생했습니다.

메뉴 항목이 강조 표시된 시기를 감지하는 데 사용할 수 있는 .NET 9가 추가 ToolStripItem.SelectedChanged되었습니다.