영어로 읽기

다음을 통해 공유


자습서: CLR 애플리케이션에 네이티브 종속성 설치

C++/CLI는 .NET 클래스를 네이티브 C++ 형식과 결합하여 C++ 코드를 사용하고 .NET 프로그램에서 액세스할 수 있도록 하는 라이브러리 및 애플리케이션을 만들 수 있는 기술입니다.

C++/CLI와 함께 vcpkg를 사용하여 CLR(공용 언어 런타임)을 대상으로 하는 프로젝트에서 C++ 종속성을 설치하고 사용할 수 있습니다.

이 자습서에서는 다음을 수행하는 방법을 배우게 됩니다.

필수 조건

샘플 C++/CLI 빌드

이 자습서에서는 기존 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 버전 및 플랫폼 도구 집합 버전을 최신 버전으로 지정합니다.

C++ 네이티브 종속성 추가

다음으로 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 이 예로 설정

MixedLibrary 프로젝트 속성

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

다음 단계

또한 다른 유용한 기능에 대해 알아봅니다.