다음을 통해 공유


단계별 설명 - C#/WinRT 구성 요소를 만들고 C++/WinRT에서 사용

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

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

WinUI 3 컨트롤을 사용하여 Windows 앱 SDK 애플리케이션에서 사용할 수 있도록 C#/WinRT로 WinUI 컨트롤을 작성하는 방법에 대한 안내는 안내: WinUI 3 컨트롤로 C# 구성 요소 작성 및 C++ Windows 앱 SDK 애플리케이션에서 사용 문서를 참조하십시오.

필수 조건

이 연습을 수행하려면 다음 도구와 구성 요소가 필요합니다.

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

먼저 Visual Studio에서 새 프로젝트를 만듭니다. 클래스 라이브러리 프로젝트 템플릿을 선택하고, 프로젝트 이름을 AuthoringDemo로 지정하십시오. 프로젝트에 다음과 같은 추가 및 수정을 수행해야 합니다.

  1. TargetFramework 파일의 을(를) 업데이트하고 다음 요소를 PropertyGroup에 추가합니다.

    <PropertyGroup>
        <TargetFramework>net8.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 NuGet 패키지를 검색하고 최신 버전을 설치합니다. 이 연습에서는 C#/WinRT 버전 1.4.1을 사용합니다.

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

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

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

  4. 라이브러리 .cs 클래스 파일을 사용하여 런타임 클래스를 작성할 수 있습니다. Class1.cs 파일을 마우스 오른쪽 버튼으로 클릭한 후 이름을 Example.cs로 변경합니다. 런타임 클래스에 public 속성 및 메서드를 추가하는 다음 코드를 이 파일에 추가합니다. 기억하세요, 런타임 구성 요소에서 노출하려는 클래스를 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 프로젝트를 마우스 오른쪽 단추로 클릭하고 을 선택하여 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 콘솔 애플리케이션 프로젝트 템플릿을 검색합니다. 템플릿을 선택하고 다음을 클릭합니다.

    다. 새 프로젝트의 이름을 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>
    

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

    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 콘솔 출력