다음을 통해 공유


WinForms(Windows Forms) 앱에서 Windows 앱 SDK 사용

Windows 앱 SDK Windows 앱 개발 플랫폼의 차세대 진화입니다. 그러나 이 항목에서는 Windows Forms(WinForms) 앱에서 Windows 앱 SDK API(및 Windows 런타임 API)를 사용하는 방법을 보여 줍니다.

  • 대부분의 경우 WinForms 앱을 WinUI 3 앱 형태로 다시 만들어야 합니다. WinUI 3로 이동할 때의 장점 중 하나는 Fluent Design System에 액세스할 수 있다는 것입니다( Design and Code Windows Apps참조). 또한 WinUI 3은 Windows 앱 SDK 일부이므로 WinUI 3 앱은 다른 Windows 앱 SDK 기능과 API도 사용할 수 있습니다. 이 항목에서는 WinForms 앱을 WinUI 3로 마이그레이션하는 과정에 대해 설명하지 않습니다.
  • 그러나 WinUI 3에서 아직 사용할 수 없는 WinForms 기능을 사용하는 경우에도 WinForms 앱에서 Windows App SDK 기능(예: App Lifecycle, MRT Core, DWriteCore 등)을 사용할 수 있습니다. 이 항목에서는 다음 방법을 보여 줍니다.

또한 기존 WinForms 프로젝트가 아직 없거나 이 프로세스를 연습하려는 경우 이 항목에는 WinForms 프로젝트를 생성하여 Windows App SDK API를 호출하도록 구성하는 단계가 포함되어 있습니다.

필수 조건

  1. Windows 앱 SDK용 도구 설치.
  2. 이 항목에서는 포장되지 않은 WinForms 앱과 포장되지 않은 WinForms 앱을 모두 다룹니다. WinForms 앱이 포장 해제된 경우(기본적으로 WinForms 앱), 포장 해제된 앱의 모든 종속성이 설치되었는지 확인합니다(외부 위치로 포장되거나 포장 해제된 프레임워크 종속 앱의 경우 Windows App SDK 배포 가이드 참조). 간단한 방법은 Windows App SDK의 최신 다운로드를 방문한 다음 안정적인 릴리스 Runtime Downloads 중 하나를 다운로드하여 압축을 풀고 실행하는 것입니다.

Important

설치하는 런타임 버전은 이후 단계에서 설치할 Microsoft.WindowsAppSDK NuGet 패키지 버전과 일치해야 합니다.

unpackagedpackaged 용어에 대한 자세한 내용은 앱 포장의 장단점을 참조하십시오.

아직 WinForms 프로젝트가 없는 경우 WinForms 프로젝트 생성

이미 WinForms 프로젝트가 있는 경우 다음 섹션으로 이동할 수 있습니다.

  1. Visual Studio에서 새 C# Windows Forms 앱 프로젝트(.NET 프로젝트)를 만듭니다. Windows Forms 앱(.NET Framework)이 아닌 정확한 이름 Windows Forms 앱으로 프로젝트 템플릿을 선택해야 합니다.
  2. 프로젝트에 이름을 지정하고 모든 기본 옵션을 적용합니다.

이제 패키지되지 않은 WinForms 앱을 빌드하는 프로젝트가 있습니다.

Windows 앱 SDK 지원을 위해 WinForms 프로젝트 구성

먼저 프로젝트 파일을 편집합니다.

  1. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고, 프로젝트 파일 편집을 선택합니다.

  2. 이 단계를 통해 WinRT(Windows 런타임) API ( Windows 앱 SDK API 포함)를 호출할 수 있습니다. 이 PropertyGroup 요소 내부에는 net6.0과 같은 값으로 설정된 TargetFramework 요소가 있습니다. 해당 대상 프레임워크 값에 모니커(특히 대상 프레임워크 모니커)를 추가합니다. 예를 들어 앱이 Windows 10 버전 2004를 대상으로 하는 경우 다음을 사용합니다:

    <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
    
  3. 또한 PropertyGroup 요소 내에 다음과 같이 RuntimeIdentifiers 요소를 추가합니다.

    <RuntimeIdentifiers>win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>
    
  4. 기본적으로 WinForms 앱은 패키지되지 않습니다(즉, MSIX를 사용하여 설치되지 않음). 패키지되지 않은 앱은 Windows 앱 SDK 다른 기능을 사용하기 전에 Windows 앱 SDK 런타임을 초기화해야 합니다. 자동 초기화를 통해 앱이 시작될 때 자동으로 수행할 수 있습니다. 다음과 같이 WindowsPackageType 프로젝트 속성을 적절하게 설정하면 됩니다( PropertyGroup 요소 내부에도):

    <WindowsPackageType>None</WindowsPackageType>
    

    사용자 지정 오류 처리 또는 특정 버전의 Windows App SDK 로드와 같은 고급 요구 사항이 있는 경우 자동 초기화 대신 부트스트래퍼 API를 명시적으로 호출할 수 있습니다. 자세한 내용은 외부 위치로 패키지화되거나 패키지화되지 않은 앱의 경우 Windows App SDK 런타임 사용을 참조하십시오.

  5. 프로젝트 파일을 저장한 후 닫습니다.

다음으로, 프로젝트에 Windows 앱 SDK NuGet 패키지를 설치합니다.

  1. Solution Explorer에서 프로젝트의 Dependencies 노드를 마우스 오른쪽 버튼으로 클릭하고 Manage Nuget Package...을 선택합니다.
  2. NuGet 패키지 관리자 창에서 찾아보기 탭을 선택하고 안정적인 최신 Microsoft.WindowsAppSDK 패키지를 설치합니다.

WinForms 앱에서 몇 가지 Windows 앱 SDK 기능 사용

이 섹션에서는 WinForms 앱에서 Windows 앱 SDK API를 호출하는 매우 간단한 예제를 제공합니다. MRT Core 기능을 사용합니다( MRT Core를 사용하여 리소스 관리 참조). 이 예제가 WinForms 프로젝트에 대해 작동하는 경우(이 연습을 위해 새 프로젝트를 만든 경우) 다음 단계를 수행할 수 있습니다.

  1. 뷰 디자이너 명령을 사용하여 Form1.cs 열고 단추와 레이블을 도구 상자에서 디자이너로 끕니다.

  2. 버튼을 두 번 클릭하여 이벤트 처리기를 생성합니다.

  3. 이제 Windows 앱 SDK ResourceManager 클래스를 사용하여 문자열 리소스를 로드하는 일부 코드를 추가합니다.

    1. 프로젝트에 새 리소스 파일(.resw) 항목을 추가합니다( Resources.resw의기본 이름을 그대로 둡니다).

    2. 편집기에서 리소스 파일을 연 상태에서 다음 속성을 사용하여 새 문자열 리소스를 만듭니다.

      • 이름: 메시지
      • 값: 안녕하세요, 리소스!
    3. 리소스 파일을 저장하고 닫습니다.

    4. Form1.cs 열고 (해당 코드 보기 명령을 사용하여) 이벤트 처리기를 편집하여 다음과 같이 표시합니다.

    private void button1_Click(object sender, EventArgs e)
    {
        // Construct a resource manager using the resource index generated during build.
        var manager =
            new Microsoft.Windows.ApplicationModel.Resources.ResourceManager();
    
        // Look up a string in the resources file using the string's name.
        label1.Text = manager.MainResourceMap.GetValue("Resources/Message").ValueAsString;
    }
    
  4. 프로젝트를 빌드하고, 앱을 실행합니다. 표시된 문자열 Hello, resources! 을 보려면 단추를 클릭합니다.

런타임에 응용 프로그램에 특정 버전의 Windows App Runtime이 필요하다는 메시지 상자가 표시되고 지금 설치할지 묻는 경우 Yes를 클릭합니다. 그러면 Windows 앱 SDK 대한 최신 다운로드로 연결됩니다. 자세한 내용은 위의 전제 조건 섹션을 참조하십시오.

또한 Windows App SDK를 사용할 때 앱이 취하는 Framework 패키지 종속성과 포장되지 않은 앱에서 작동하는 데 필요한 추가 구성 요소에 대한 자세한 내용은 Runtime Architecture를 참조하십시오.

MSIX로 WinForms 앱 패키징 및 배포

일부 Windows 기능 및 API(Windows App SDK 알림 API포함)는 런타임에 앱이 패키지 ID를 가져야 합니다(즉, 앱이 패키지이어야 합니다). 자세한 내용은 패키지 ID가 필요한 기능을 참조하세요.

  1. Visual Studio의 Solution Explorer에서 솔루션을 마우스 오른쪽 버튼으로 클릭하고 Add>New Project...을 선택합니다.
  2. 새 프로젝트 추가 대화상자에서 포장를 검색하고 C# Windows Application Packaging Project 프로젝트 템플릿을 선택한 후 Next을 클릭합니다.
  3. 프로젝트 이름을 지정하고, 만들기를 클릭합니다.
  4. 패키지에 포함할 솔루션의 애플리케이션을 지정하려고 합니다. 따라서 패키징 프로젝트(WinForms 프로젝트가아닌 )에서 의존성 노드를 마우스 오른쪽 버튼으로 클릭하고 프로젝트 참조 추가...을 선택합니다.
  5. 솔루션의 프로젝트 목록에서 WinForms 프로젝트를 선택하고 OK를 클릭합니다.
  6. 패키징 프로젝트의 Dependencies>Applications 노드를 확장하고 WinForms 프로젝트가 참조되고 굵은 글씨로 강조 표시되는지 확인합니다. 이는 프로젝트가 패키지의 시작점으로 사용된다는 의미입니다.
  7. 패키징 프로젝트를 마우스 오른쪽 단추로 클릭하고, 시작 프로젝트로 설정을 선택합니다.
  8. WinForms 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 프로젝트 파일 편집를 선택합니다.
  9. 삭제 <WindowsPackageType>None</WindowsPackageType>, 저장 및 닫습니다.
  10. Solution Platforms 드롭다운에서 x64 ( Any Cpu대신)를 선택합니다.
  11. 빌드하고 실행할 수 있는지 확인합니다.

이제 WinForms 앱을 패키지했으므로 패키지 ID가 필요한 API를 호출할 수 있습니다. 그리고 Form1.cs 열고 (해당 코드 보기 명령을 사용하여) 이벤트 처리기를 편집하여 다음과 같이 표시합니다.

private void button1_Click(object sender, EventArgs e)
{
    var notification = new AppNotificationBuilder()
        .AddArgument("action", "viewConversation")
        .AddArgument("conversationId", "9813")
        .AddText("Andrew sent you a picture")
        .AddText("Check this out, The Enchantments in Washington!")
        .BuildNotification();

    AppNotificationManager.Default.Show(notification);
}

빌드하고 다시 실행합니다. 단추를 클릭하고 알림 메시지가 표시되는지 확인합니다. 런타임에 패키지 ID가 없는 프로세스에서 호출되면 알림 API는 예외를 throw합니다.

참고 항목

이 섹션의 단계에서는 패키지 앱을 만드는 방법을 보여주었습니다. 다른 방법은 외부 위치를 사용하여 패키지된 앱을 만드는 것입니다. 이 모든 용어를 상기시키려면 앱 포장의 장단점를 참조하십시오.