다음을 통해 공유


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

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

비동기 양식

중요합니다

이 기능 집합은 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는 분석기와 함께 제공되며, 이는 바이너리 직렬화에 무심코 참여할 때를 식별하는 데 도움을 줍니다.

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

다크 모드

중요합니다

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

.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 여러 폴더 선택을 지원합니다. 여러 폴더를 사용하도록 설정하려면 Multiselecttrue로 설정합니다.

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로 대체되었습니다.

툴스트립

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

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

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

.NET Core 3.1이 출시되었을 때, Menu-관련 컨트롤, 예를 들어 MainMenuMenuItem가 제거되었습니다. ToolStrip 대신 ToolStripMenuItem 사용해야 합니다. 그러나 ToolStripItemToolStripMenuItem 이벤트에 대한 대체 기능을 포함하지 않는 MenuItem.Select의 기본 클래스입니다. 이 이벤트는 마우스 또는 키보드를 사용하여 항목을 강조 표시할 때 발생했습니다.

.NET 9에는 메뉴 항목이 강조 표시될 때를 감지할 수 있는 ToolStripItem.SelectedChanged가 추가되었습니다.