이 항목에서는 C++/WinRT 프로젝트에 간단한 C# 구성 요소를 추가하는 과정을 안내합니다.
Visual Studio를 사용하면 C# 또는 Visual Basic으로 작성된 WINDOWS 런타임 구성 요소(WRC) 프로젝트 내에서 사용자 지정 Windows 런타임 형식을 쉽게 작성하고 배포한 다음, C++ 애플리케이션 프로젝트에서 해당 WRC를 참조하고 해당 애플리케이션에서 해당 사용자 지정 형식을 사용할 수 있습니다.
내부적으로 Windows 런타임 형식은 UWP 애플리케이션에서 허용되는 모든 .NET 기능을 사용할 수 있습니다.
비고
자세한 내용은 C# 및 Visual Basic로 작성된 Windows 런타임 구성 요소
외부적으로, 형식의 멤버는 해당 매개변수와 반환 값에 대해 오직 Windows 런타임 형식만을 노출할 수 있습니다. 솔루션을 빌드할 때 Visual Studio는 .NET WRC 프로젝트를 빌드한 다음 Windows 메타데이터(.winmd) 파일을 만드는 빌드 단계를 실행합니다. 이는 Visual Studio가 앱에 포함하는 Windows 런타임 구성 요소(WRC)입니다.
비고
.NET은 기본 데이터 형식 및 컬렉션 형식과 같이 일반적으로 사용되는 일부 .NET 형식을 해당 Windows 런타임에 자동으로 매핑합니다. 이러한 .NET 형식은 Windows 런타임 구성 요소의 공용 인터페이스에서 사용할 수 있으며 해당 Windows 런타임 형식으로 구성 요소 사용자에게 표시됩니다. C# 및 Visual Basic을 사용한
필수 조건
- Windows 10
- Microsoft Visual Studio
빈 앱 만들기
Visual Studio에서 빈 앱(C++/WinRT) 프로젝트 템플릿을 사용하여 새 프로젝트를 만듭니다. (C++/WinRT) 템플릿을 사용하고 있는지 확인하세요, (유니버설 Windows) 템플릿은 사용하지 마세요.
새 프로젝트의 이름을 CppToCSharpWinRT으로 설정하여 폴더 구조를 연습과 일치시킵니다.
솔루션에 C# Windows 런타임 구성 요소 추가
Visual Studio에서 구성 요소 프로젝트를 만듭니다. 솔루션 탐색기에서
비고
새 유니버설 Windows 플랫폼 프로젝트 대화 상자에서 Windows 10 크리에이터스 업데이트(10.0; 빌드 15063) 최소 버전으로. 자세한 내용은 아래 애플리케이션 최소 버전 섹션을 참조하세요.
C# GetMyString 메서드 추가
SampleComponent 프로젝트에서 클래스 이름을 Class1 에서 예제로 변경합니다. 그런 다음, 클래스에 두 개의 간단한 멤버, 즉 프라이빗 int
필드와 GetMyString이라는 인스턴스 메서드를추가합니다.
public sealed class Example { int MyNumber; public string GetMyString() { return $"This is call #: {++MyNumber}"; } }
비고
기본적으로 클래스는 public 및 sealed로 표시됩니다. 구성 요소에서 노출하는 모든 Windows 런타임 클래스는 봉인된
비고
선택 사항: 새로 추가된 멤버에 대해 IntelliSense를 사용하도록 설정하려면 솔루션 탐색기에서
CppToCSharpWinRT 프로젝트에서 C# SampleComponent를 참조하십시오.
솔루션 탐색기의 C++/WinRT 프로젝트에서 참조에 대한 바로 가기 메뉴를 연 다음 추가 참조 를 선택하여 참조 추가 대화 상자를 엽니다. 프로젝트선택한 다음 솔루션선택합니다. SampleComponent 프로젝트의 체크박스를 선택하고 확인을 선택하여 참조를 추가합니다.
비고
선택 사항: C++/WinRT 프로젝트에 IntelliSense를 사용하도록 설정하려면 솔루션 탐색기에서
MainPage.h 편집
MainPage.h
프로젝트에서 을 연 다음 두 항목을 추가합니다. 먼저 #include "winrt/SampleComponent.h"
문의 끝에 #include
추가한 다음 winrt::SampleComponent::Example
구조체에 MainPage
필드를 추가합니다.
// MainPage.h
...
#include "winrt/SampleComponent.h"
namespace winrt::CppToCSharpWinRT::implementation
{
struct MainPage : MainPageT<MainPage>
{
...
winrt::SampleComponent::Example myExample;
...
};
}
비고
Visual Studio에서 MainPage.h
MainPage.xaml
아래에 나열됩니다.
MainPage.cpp를 편집하기
MainPage.cpp
에서 구현을 변경하여 Mainpage::ClickHandler
이 C# 메서드 GetMyString
를 호출하도록 합니다.
void MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
//myButton().Content(box_value(L"Clicked"));
hstring myString = myExample.GetMyString();
myButton().Content(box_value(myString));
}
프로젝트 실행
이제 프로젝트를 빌드하고 실행할 수 있습니다. 단추를 클릭할 때마다 단추의 숫자가 증가합니다.
C++/WinRT Windows가 C# 구성 요소를 호출하는 스크린샷
팁 (조언)
Visual Studio에서 구성 요소 프로젝트를 만듭니다. 솔루션 탐색기에서 CppToCSharpWinRT 프로젝트의 바로 가기 메뉴를 열고 속성선택한 다음 구성 속성디버깅 선택합니다. C#(관리) 및 C++(네이티브) 코드를 모두 디버그하려면 디버거 형식을 관리형 및 네이티브 설정합니다.
애플리케이션 최소 버전
C# 프로젝트 버전의 애플리케이션 최소는 애플리케이션을 컴파일하는 데 사용되는 .NET 버전을 제어합니다. 예를 들어 Windows 10 Fall Creators Update (10.0; 빌드 16299) 이상을 선택하면 .NET Standard 2.0 및 Windows Arm64 프로세서 지원을 사용할 수 있습니다.
팁 (조언)
.NET Standard 2.0 또는 Arm64 지원이 필요하지 않은 경우 추가 빌드 구성을 방지하려면 16299보다 낮은 애플리케이션 최소 버전을 사용하는 것이 좋습니다.
Windows 10 Fall Creators Update에 대한 구성(10.0; 빌드 16299)
C++/WinRT 프로젝트에서 참조되는 C# 프로젝트에서 .NET Standard 2.0 또는 Windows Arm64 지원을 사용하도록 설정하려면 다음 단계를 수행합니다.
Visual Studio에서 솔루션 탐색기로 이동하여 CppToCSharpWinRT 프로젝트의 바로 가기 메뉴를 엽니다. 속성을 선택하고 Universal Windows App 최소 버전을 Windows 10 Fall Creators Update(10.0; 빌드 16299) 이상으로 설정합니다. SampleComponent 프로젝트에 대해 동일한 작업을 수행합니다.
Visual Studio에서
다음 XML을 복사하여 PropertyGroup
의 첫 번째 CPPWinRTCSharpV2.vcxproj
에 붙여넣습니다.
<!-- Start Custom .NET Native properties -->
<DotNetNativeVersion>2.2.12-rel-31116-00</DotNetNativeVersion>
<DotNetNativeSharedLibrary>2.2.8-rel-31116-00</DotNetNativeSharedLibrary>
<UWPCoreRuntimeSdkVersion>2.2.14</UWPCoreRuntimeSdkVersion>
<!--<NugetPath>$(USERPROFILE)\.nuget\packages</NugetPath>-->
<NugetPath>$(ProgramFiles)\Microsoft SDKs\UWPNuGetPackages</NugetPath>
<!-- End Custom .NET Native properties -->
DotNetNativeVersion
, DotNetNativeSharedLibrary
및 UWPCoreRuntimeSdkVersion
값은 Visual Studio 버전에 따라 달라질 수 있습니다. 올바른 값으로 설정하려면 %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages
열고 아래 표의 각 값에 대한 하위 디렉터리를 확인합니다.
%ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler
디렉터리에는 .NET 네이티브의 설치된 버전을 포함하며 2.2
로 시작하는 하위 디렉터리가 있습니다. 아래 예제에서는 2.2.12-rel-31116-00
.
MSBuild 변수 디렉터리 예시 DotNetNativeVersion %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler
2.2.12-rel-31116-00
DotNetNativeSharedLibrary %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-x64.microsoft.net.native.sharedlibrary
2.2.8-rel-31116-00
UWPCoreRuntimeSdkVersion %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.UWPCoreRuntimeSdk
2.2.14
비고
Microsoft.Net.Native.SharedLibrary에 지원되는 아키텍처는 여러 가지가 있습니다.
x64
적절한 아키텍처로 바꿉다. 예를 들어 arm64
아키텍처는 %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-arm64.microsoft.net.native.sharedlibrary
디렉터리에 있습니다.
그런 다음, 첫 번째 PropertyGroup
직후에 다음을 변경하지 않고 추가합니다.
<!-- Start Custom .NET Native targets -->
<!-- Import all of the .NET Native / CoreCLR props at the beginning of the project -->
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x86.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x64.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm64.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary.props" />
<!-- End Custom .NET Native targets -->
프로젝트 파일의 끝에 닫는 Project
태그 바로 앞에 다음을 추가합니다(변경되지 않음).
<!-- Import all of the .NET Native / CoreCLR targets at the end of the project -->
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x86.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x64.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm64.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary.targets" />
<!-- End Custom .NET Native targets -->
Visual Studio에서 프로젝트 파일을 다시 로드합니다. 이렇게 하려면 Visual Studio 솔루션 탐색기에서
.NET 네이티브용 빌드
.NET 네이티브에 대해 빌드된 C# 구성 요소를 사용하여 애플리케이션을 빌드하고 테스트하는 것이 좋습니다. Visual Studio에서
다음으로, C++ 프로젝트 파일의 Release 및 Arm64 구성에서 UseDotNetNativeToolchain
속성을 true
로 설정합니다.
Visual Studio 솔루션 탐색기에서 CppToCSharpWinRT 프로젝트의 바로 가기 메뉴를 열고 프로젝트 다시 로드을 선택합니다.
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
...
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='Arm64'" Label="Configuration">
<UseDotNetNativeToolchain Condition="'$(UseDotNetNativeToolchain)'==''">true</UseDotNetNativeToolchain>
</PropertyGroup>
다른 C# NuGet 패키지 참조
C# 구성 요소가다른
SampleComponent.csproj 파일에서 nuget 패키지 참조를 추가합니다.
<PackageReference Include="Newtonsoft.Json">
<Version>13.0.1</Version>
</PackageReference>
CppToCSharpWinRT 프로젝트에서 packages.config 파일을 찾아 적절한 nuget 참조를 추가합니다. 그러면 솔루션의 패키지 폴더에 nuget 패키지가 설치됩니다.
packages.config에 동일한 NuGet 패키지 참조를 추가합니다.
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="native" developmentDependency="true" />
그런 다음 애플리케이션 프로젝트 파일에 다음을 추가하여 솔루션의 패키지 폴더에서 적절한 파일 종속성을 참조합니다. 예를 들어 CppToCSharpWinRT.vcxproj 다음을 추가합니다.
<ItemGroup>
<None Include="..\packages\Newtonsoft.Json.13.0.1\lib\netstandard2.0\Newtonsoft.Json.dll">
<Link>%(Filename)%(Extension)</Link>
<DeploymentContent>true</DeploymentContent>
</None>
</ItemGroup>
관련 항목
- C# 및 Visual Basic을 사용한 Windows 런타임 구성 요소
- C++/WinRT를 사용한 Windows 런타임 구성 요소