다음을 통해 공유


연습—C#/WinRT 구성 요소를 만들고 C++/WinRT에서 사용

C#/WinRT를 사용하면 .NET을 사용하는 개발자가 클래스 라이브러리 프로젝트를 사용하여 C#으로 자체 Windows 런타임 구성 요소를 작성할 수 있습니다. 작성된 구성 요소는 네이티브 데스크톱 애플리케이션에서 패키지 참조 또는 몇 가지 수정 내용이 있는 프로젝트 참조로 사용할 수 있습니다.

이 연습에서는 C#/WinRT를 사용하여 간단한 Windows 런타임 구성 요소를 만들고, 구성 요소를 NuGet 패키지로 배포하고, C++/WinRT 콘솔 애플리케이션에서 구성 요소를 사용하는 방법을 보여줍니다. 이 문서에 대한 코드를 제공하는 전체 샘플은 C#/WinRT 제작 샘플을 참조하세요. 작성에 대한 자세한 내용은 구성 요소 작성을 참조하세요.

특히 Windows 앱 SDK 애플리케이션에서 사용하기 위해 C#/WinRT를 사용하여 WinUI 컨트롤을 작성하는 방법에 대한 안내는 연습: WinUI 3 컨트롤을 사용하여 C# 구성 요소 작성 및 C++ Windows 앱 SDK 애플리케이션에서 사용 문서를 참조하세요.

전제 조건

이 연습에는 다음 도구와 구성 요소가 필요합니다.

C#/WinRT를 사용하여 간단한 Windows 런타임 구성 요소 만들기

Visual Studio에서 새 프로젝트를 만들어 시작합니다. 클래스 라이브러리 프로젝트 템플릿을 선택하고 프로젝트 이름을 AuthoringDemo로 지정합니다. 프로젝트를 다음과 같이 추가하고 수정해야 합니다.

  1. AuthoringDemo.csproj 파일에서 TargetFramework를 업데이트하고 PropertyGroup에 다음 요소를 추가합니다.

    <PropertyGroup>
        <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
        <Platforms>x64</Platforms>
    </PropertyGroup>
    

    Windows 런타임 형식에 액세스하려면 TFM에서 특정 Windows SDK 버전을 설정해야 합니다. 지원되는 버전에 대한 자세한 내용은 .NET 6 이상: TFM 옵션 사용을 참조하세요.

  2. 프로젝트에 Microsoft.Windows.CsWinRT NuGet 패키지를 설치합니다.

    a. 솔루션 탐색기에서 프로젝트 노드를 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리를 선택합니다.

    b. Microsoft.Windows.CsWinRT 패키지를 검색하고 최신 버전을 설치합니다. 이 연습에서는 C#/WinRT 버전 1.4.1을 사용합니다.

  3. CsWinRTComponent 속성을 설정하는 새 PropertyGroup 요소를 추가합니다. 이는 프로젝트가 Windows 런타임 구성 요소임을 지정하므로 프로젝트를 빌드할 때 .winmd 파일이 생성됩니다.

    <PropertyGroup>   
        <CsWinRTComponent>true</CsWinRTComponent>
    </PropertyGroup>
    

    C#/WinRT 프로젝트 속성의 전체 목록은 C#/WinRT NuGet 설명서를 참조하세요.

  4. 라이브러리 .cs 클래스 파일을 사용하여 런타임 클래스를 작성할 수 있습니다. Class1.cs 파일을 마우스 오른쪽 단추로 클릭하고 이름을 Example.cs로 바꿉니다. 공용 속성 및 메서드를 런타임 클래스에 추가하는 다음 코드를 이 파일에 추가합니다. 런타임 구성 요소 public에서 노출하려는 모든 클래스를 표시해야 합니다.

    namespace AuthoringDemo
    {
        public sealed class Example
        {
            public int SampleProperty { get; set; }
    
            public static string SayHello()
            {
                return "Hello from your C# WinRT component";
            }
        }
    }
    
  5. 이제 프로젝트를 빌드하여 구성 요소에 대한 .winmd 파일을 생성할 수 있습니다. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 빌드를 클릭합니다. 빌드 출력 폴더에 생성된 AuthoringDemo.winmd 파일이 표시됩니다.

구성 요소에 대한 NuGet 패키지 생성

대부분의 개발자는 Windows 런타임 구성 요소를 NuGet 패키지로 배포하고 공유하려고 합니다. 또 다른 옵션은 구성 요소를 프로젝트 참조로 사용하는 것입니다. 다음 단계에서는 AuthoringDemo 구성 요소를 패키지하는 방법을 보여 줍니다. 패키지를 생성하면 C#/WinRT는 네이티브 애플리케이션에서 사용할 수 있도록 패키지의 구성 요소와 호스팅 어셈블리를 구성합니다.

NuGet 패키지를 생성하는 방법에는 여러 가지가 있습니다.

  • 프로젝트를 빌드할 때마다 NuGet 패키지를 생성하려면 AuthoringDemo 프로젝트 파일에 다음 속성을 추가한 다음, 프로젝트를 다시 빌드합니다.

    <PropertyGroup>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    </PropertyGroup>
    
  • 또는 솔루션 탐색기 AuthoringDemo 프로젝트를 마우스 오른쪽 단추로 클릭하고 Pack을 선택하여 NuGet 패키지를 생성할 수 있습니다.

패키지를 빌드할 때 빌드 창에 NuGet 패키지 AuthoringDemo.1.0.0.nupkg가 성공적으로 생성되었음을 나타내야 합니다. .NET CLI를 사용한 NuGet 패키지 속성에 대한 자세한 내용은 dotnet CLI를 사용하여 패키지 만들기를 참조하세요.

C++/WinRT 앱에서 구성 요소 사용

C#/WinRT로 작성된 Windows 런타임 구성 요소는 모든 WinRT(Windows 런타임) 호환 언어에서 사용할 수 있습니다. 다음 단계에서는 C++/WinRT 콘솔 애플리케이션에서 위의 작성된 구성 요소를 호출하는 방법을 보여줍니다.

참고 항목

C#/.NET 앱에서 C#/WinRT 구성 요소를 사용하는 것은 패키지 참조 또는 프로젝트 참조에서 모두 지원됩니다. 이 시나리오는 일반적인 C# 클래스 라이브러리를 사용하는 것과 동일하며 대부분의 경우 WinRT 활성화를 포함하지 않습니다. C#/WinRT 1.3.5부터 C# 소비자에 대한 프로젝트 참조에는 .NET 6이 필요합니다.

  1. C++/WinRT 콘솔 애플리케이션 프로젝트를 솔루션에 추가합니다. 이 프로젝트를 선택하는 경우 다른 솔루션의 일부가 될 수도 있습니다.

    a. 솔루션 탐색기에서 솔루션 노드를 마우스 오른쪽 단추로 클릭하고 추가 ->새 프로젝트를 클릭합니다.

    b. 새 프로젝트 추가 대화 상자에서 C++/WinRT 콘솔 애플리케이션 프로젝트 템플릿을 검색합니다. 템플릿을 선택하고 다음을 클릭합니다.

    c. 새 프로젝트의 이름을 CppConsoleApp으로 지정하고 만들기를 클릭합니다.

  2. AuthoringDemo 구성 요소에 대한 참조를 NuGet 패키지 또는 프로젝트 참조로 추가합니다.

    • 옵션 1(패키지 참조):

      a. CppConsoleApp 프로젝트를 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리를 선택합니다. AuthoringDemo NuGet 패키지에 대한 참조를 추가하도록 패키지 원본을 구성해야 할 수 있습니다. 이렇게 하려면 NuGet 패키지 관리자에서 설정 아이콘을 클릭하고 적절한 경로에 패키지 원본을 추가합니다.

      NuGet 설정

      b. 패키지 원본을 구성한 후 AuthoringDemo 패키지를 검색하고 설치를 클릭합니다.

      NuGet 패키지 설치

    • 옵션 2(프로젝트 참조):

      a. CppConsoleApp 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가 ->참조를 선택합니다. 프로젝트 노드에서 AuthoringDemo 프로젝트에 대한 참조를 추가합니다.

  3. 구성 요소를 호스팅하려면 활성화 가능한 클래스 등록을 위한 매니페스트 파일을 추가해야 합니다. 관리형 구성 요소 호스팅에 대한 자세한 내용은 관리형 구성 요소 호스팅을 참조하세요.

    a. 매니페스트 파일을 추가하려면 프로젝트를 다시 마우스 오른쪽 단추로 클릭하고 추가 ->새 항목을 선택합니다. 텍스트 파일 템플릿을 검색하고 이름을 CppConsoleApp.exe.manifest로 지정합니다. 활성화 가능한 클래스 등록 항목을 사용하여 런타임 클래스를 지정하는 다음 콘텐츠를 붙여넣습니다.

    <?xml version="1.0" encoding="utf-8"?>
    <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
        <assemblyIdentity version="1.0.0.0" name="CppConsoleApp"/>
        <file name="WinRT.Host.dll">
            <activatableClass
                name="AuthoringDemo.Example"
                threadingModel="both"
                xmlns="urn:schemas-microsoft-com:winrt.v1" />
        </file>
    </assembly>
    

    패키지되지 않은 앱에는 애플리케이션 매니페스트 파일이 필요합니다. 패키지된 앱의 경우 앱 소비자는 연습: WinUI 3 컨트롤을 사용하여 C# 구성 요소를 만들고 C++ Windows App SDK 애플리케이션에서 사용에 설명된 대로 Package.appxmanifest 패키지 매니페스트 파일에 활성화 가능한 클래스를 등록해야 합니다.

    b. 프로젝트를 배포할 때 출력에 매니페스트 파일을 포함하도록 프로젝트를 수정합니다. 솔루션 탐색기에서 CppConsoleApp.exe.manifest 파일을 클릭하고 Content 속성을 True로 설정합니다. 다음은 어떻게 보이는지에 대한 예입니다.

    콘텐츠 배포

  4. 프로젝트의 헤더 파일 아래에서 pch.h를 열고 구성 요소를 포함하는 다음 코드 줄을 추가합니다.

    #include <winrt/AuthoringDemo.h>
    
  5. 프로젝트의 소스 파일 아래에서 main.cpp를 열고 다음 콘텐츠로 바꿉니다.

    #include "pch.h"
    #include "iostream"
    
    using namespace winrt;
    using namespace Windows::Foundation;
    
    int main()
    {
        init_apartment();
    
        AuthoringDemo::Example ex;
        ex.SampleProperty(42);
        std::wcout << ex.SampleProperty() << std::endl;
        std::wcout << ex.SayHello().c_str() << std::endl;
    }
    
  6. CppConsoleApp 프로젝트를 빌드하고 실행합니다. 이제 아래 출력이 표시되어야 합니다.

    C++/WinRT 콘솔 출력