자습서: CLR 애플리케이션에 네이티브 종속성 설치
C++/CLI는 .NET 클래스를 네이티브 C++ 형식과 결합하여 C++ 코드를 사용하고 .NET 프로그램에서 액세스할 수 있도록 하는 라이브러리 및 애플리케이션을 만들 수 있는 기술입니다.
C++/CLI와 함께 vcpkg를 사용하여 CLR(공용 언어 런타임)을 대상으로 하는 프로젝트에서 C++ 종속성을 설치하고 사용할 수 있습니다.
이 자습서에서는 다음을 수행하는 방법을 배우게 됩니다.
- vcpkg
- Git
- Visual Studio용 개발자 Powershell
- 다음 구성 요소가 포함된 Visual Studio :
이 자습서에서는 기존 C++/CLI 애플리케이션에서 시작하여 vcpkg와 함께 설치된 C++ 종속성을 추가합니다. 이 자습서의 명령은 Visual Studio용 개발자 PowerShell에서 실행 중이라고 가정합니다.
1 - 샘플 리포지토리 복제
첫 번째 단계는 .NET 샘플 리포지토리에서 C++/CLI 샘플 애플리케이션의 복사본을 가져오는 것입니다. C++/CLI 샘플 애플리케이션은 폴더에 core/interop/cpp-cli
있습니다.
git clone https://github.com/dotnet/samples
2 - 샘플 애플리케이션 폴더로 이동합니다.
cd samples/core/interpo/cpp-cli
2 - 프로젝트가 제대로 빌드되고 실행되는지 확인
샘플 리포지토리에는 다음 네 개의 프로젝트가 포함된 솔루션이 포함되어 있습니다.
- ManagedLibrary: .NET용 C# 라이브러리
- MixedLibrary: ManagedLibrary의 네이티브 C++ 코드와 .NET 코드를 혼합하는 라이브러리
- NativeApp: MixedLibrary에서 .NET 코드를 사용하는 C++ 애플리케이션
- ManagedApp: MixedLibrary에서 C++ 코드를 사용하는 C# 애플리케이션
다음 명령을 실행하여 솔루션의 프로젝트를 빌드합니다.
msbuild CPP-CLI.sln -restore
빌드가 실패하는 경우 필수 구성 요소 섹션에 나열된 Visual Studio에 필요한 구성 요소를 설치하고 샘플 애플리케이션의 .NET 5.0 SDK 이상 및 Visual Studio 2019 16.8 이상의 최소 요구 사항을 충족하는지 확인합니다.
빌드된 후에는 실행할 수 있습니다. ManagedApp.exe
./bin/Debug/x64/ManagedApp.exe
프로그램에서는 다음이 출력됩니다.
=== Managed class ===
Hello from ManagedClass in MixedLibrary
Hello from NativeClass in MixedLibrary
-- message: from managed app!
=== P/Invoke ===
Hello from NativeEntryPoint_CallNative in MixedLibrary
Hello from NativeClass in MixedLibrary
-- message: from managed app!
3 - Visual Studio에서 프로젝트 열기
다음 단계에서는 콘솔에 메시지를 인쇄하는 데 사용할 fmt
라이브러리를 수정합니다. 라이브러리는 fmt
vcpkg를 통해 설치되고 소비 프로젝트에 연결됩니다.
원본 파일을 편집하려면 Visual Studio에서 CPP-CLI.sln 솔루션을 엽니다.
start CPP-CLI.sln
Visual Studio에서 솔루션이 열리면 프로젝트를 최신 버전으로 대상을 변경하라는 메시지가 표시될 수 있습니다. 확인을 클릭하여 Windows SDK 버전 및 플랫폼 도구 집합을 최신 버전으로 업그레이드할 수 있습니다.
프로젝트의 대상 Windows SDK 버전 및 플랫폼 도구 집합 버전을 최신 버전으로 지정합니다.
다음으로 MixedLibrary 프로젝트를 다음과 같이 변경합니다.
- 획득할 vcpkg 매니페스트를
fmt
추가합니다. - 프로젝트에서 vcpkg를 사용하도록 설정합니다.
NativeClass::Hello
메시지를 인쇄하는 데 사용할fmt
항목을 수정합니다.
1 - vcpkg 매니페스트 만들기
NativeLibrary 프로젝트를 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 새 항목 추가 > 를 클릭합니다.
새 항목 vcpkg.json
의 이름을 vcpkg 매니페스트 파일로 지정하고 해당 파일이 프로젝트 폴더의 루트에 만들어졌는지 확인합니다.
2 - 사용 안 됨으로 추가 fmt
vcpkg.json
파일을 열고 다음과 일치하도록 해당 콘텐츠를 편집합니다.
{
"dependencies": [ "fmt" ]
}
vcpkg 매니페스트 파일이 올바른 위치에 있고 프로젝트를 빌드하려고 하면 다음 경고가 표시됩니다.
The vcpkg manifest was disabled, but we found a manifest file in samples\core\interop\cpp-cli\MixedLibrary\. You may want to enable vcpkg manifests in your properties page or pass /p:VcpkgEnableManifest=true to the msbuild invocation.
3 - MixedLibrary의 속성에서 vcpkg 사용
프로젝트를 마우스 오른쪽 단추로 클릭하고 속성 옵션을 클릭하여 MixedLibrary의 속성 페이지를 엽니다.
vcpkg 섹션에서 다음 속성을 변경합니다.
- 예로 설정된 Vcpkg 사용
- 예로 설정된 Vcpkg 매니페스트 사용
- Instal Vcpkg 종속성을 예로 설정
- AutoLink를 예로 설정 사용
- 앱 로컬 배포 DLL 이 예로 설정
vcpkg를 사용하도록 설정하는 데 필요
이러한 변경 내용으로 Visual Studio는 이제 파일을 읽고 vcpkg.json
프로젝트를 빌드하기 전에 매니페스트에 포함된 종속성을 자동으로 설치합니다.
속성 페이지에 있는 동안 플래그가 올바르게 빌드되도록 fmt
설정 /utf-8
하려고 합니다.
C/C++ 설정의 명령줄 하위 섹션에서 다음 항목에 포함 /utf-8
할 추가 옵션을 편집합니다.
마지막으로 확인을 클릭하여 속성 페이지를 닫습니다.
4 - vcpkg가 작동하는지 확인
모든 항목이 올바르게 구성된 경우 Visual Studio는 MixedLibrary 프로젝트를 빌드하기 전에 vcpkg를 호출하여 종속성을 설치합니다.
1>Installing vcpkg dependencies to C:\path\to\samples\core\interop\cpp-cli\MixedLibrary\vcpkg_installed\x64-windows\
1>"C:\path\to\vcpkg\vcpkg.exe" install --x-wait-for-lock --triplet "x64-windows" --vcpkg-root "C:\path\to\vcpkg\" "--x-manifest-root=C:\path\to\samples\core\interop\cpp-cli\MixedLibrary\" "--x-install-root=C:\path\to\samples\core\interop\cpp-cli\MixedLibrary\vcpkg_installed\x64-windows\"
vcpkg 출력이 표시되지 않거나 빌드에 실패하는 경우 fmt
C/C++ > 명령줄의 추가 옵션 추가 /utf-8
를 포함하여 위의 단계를 올바르게 수행했는지 확인합니다.
4 - 프로젝트의 소스 코드 수정
마지막으로 콘솔에 메시지를 인쇄하는 데 사용할 fmt
파일을 수정 MixedLibrary.cpp
하려고 합니다. 소스 코드를 다음과 같이 변경합니다.
1 - 머리글 fmt/printf.h
(줄 5)을 포함합니다.
#include <iostream>
#include <vcclr.h>
#include <fmt/printf.h>
2 - 사용할 fmt::println
함수를 NativeClass::Hello
수정합니다(줄 44).
void MixedLibrary::NativeClass::Hello(const wchar_t *msg)
{
auto ws = std::wstring(msg);
auto str = std::string(ws.length(), 0);
std::transform(ws.begin(), ws.end(), std::back_inserter(str), [](wchar_t c) { return static_cast<char>(c); });
fmt::println("Hello from NativeClass in MixedLibrary");
fmt::println("-- message: {}", str);
fmt::println("-- printed using FMT version {}", FMT_VERSION);
}
이 NativeClass::Hello
함수는 ManagedApp 프로젝트에서 C++ 코드를 사용하여 콘솔에 메시지를 출력하는 데 사용됩니다. 위의 변경 내용을 통해 라이브러리가 fmt
CLR 애플리케이션에서 사용되도록 합니다.
애플리케이션 프로젝트에 대한 창이 필요하지 않으며 ManagedApp 프로젝트를 빌드하고 실행하기만 하면됩니다.
프로그램의 출력은 다음과 유사합니다.
=== Managed class ===
Hello from ManagedClass in MixedLibrary
Hello from NativeClass in MixedLibrary
-- message: from managed app!
-- printed using FMT version 110002
=== P/Invoke ===
Hello from NativeEntryPoint_CallNative in MixedLibrary
Hello from NativeClass in MixedLibrary
-- message: from managed app!
-- printed using FMT version 110002
또한 다른 유용한 기능에 대해 알아봅니다.
vcpkg 피드백
vcpkg은(는) 오픈 소스 프로젝트입니다. 다음 링크를 선택하여 피드백을 제공해 주세요.