방법: 유니버설 Windows 플랫폼 앱에서 기존 C++ 코드 사용How to: Use Existing C++ Code in a Universal Windows Platform App

데스크톱 프로그램을 UWP 환경에서 실행되게 하는 가장 쉬운 방법은 데스크톱 브리지 기술을 사용하는 것입니다.Perhaps the easiest way to get your desktop program running in the UWP environment is to use the Desktop Bridge technologies. 여기에는 코드를 변경할 필요 없이 기존 응용 프로그램을 UWP 앱으로 패키징하는 데스크톱 앱 변환기가 포함됩니다.These include the Desktop App Converter, which will package your existing application as a UWP app with no code changes required. 자세한 내용은 데스크톱 브리지를 사용하여 데스크톱 앱을 UWP(유니버설 Windows 플랫폼)로 가져오기를 참조하세요.For more information, see Bring your desktop app to the Universal Windows Platform (UWP) with the Desktop Bridge.

이 항목의 나머지 부분에서는 C++ 라이브러리(DLL 및 정적 라이브러리)를 UWP(유니버설 Windows 플랫폼)로 포팅하는 방법을 설명합니다.The rest of this topic discusses how to port C++ libraries (DLLs and static libraries) to the Universal Windows Platform (UWP). 여러 UWP 앱에서 핵심 C++ 논리를 사용할 수 있도록 이 작업을 수행하는 것이 좋습니다.You might want to do this so that your core C++ logic can be used with multiple UWP apps.

UWP 앱은 보호된 환경에서 실행되며 이에 따라 플랫폼의 보안을 손상시킬 수 있는 많은 Win32, COM 및 CRT API 호출이 허용되지 않습니다.UWP Apps run in a protected environment, and as a result, many Win32, COM, and CRT API calls that might compromise the security of the platform are not allowed. /ZW 옵션을 사용하는 경우 컴파일러는 이러한 호출을 검색하고 오류를 생성할 수 있습니다.The compiler can detect such calls and generate an error, if the /ZW option is used. 응용 프로그램에서 앱 인증 키트를 사용하여 금지된 API를 호출하는 코드를 검색할 수 있습니다.You can use the App Certification Kit on your application to detect code that calls forbidden APIs. 앱 인증 키트 사용을 참조하세요.See Using the App Certification Kit.

라이브러리의 소스 코드를 사용할 수 있는 경우 금지된 API 호출을 제거할 수 있습니다.If source code is available for the library, you might be able to eliminate the forbidden API calls. 허용되거나 금지되는 API의 목록을 비롯한 자세한 내용은 Windows 런타임 앱 및 UWP(유니버설 Windows 플랫폼) 앱용 Win32 및 COM유니버설 Windows 플랫폼 앱에서 지원되지 않는 CRT 함수를 참조하세요.For details including a list of APIs that are allowed or forbidden, see Win32 and COM for Windows Runtime Apps and Universal Windows platform (UWP) Apps and CRT functions not supported in Universal Windows Platform apps. 일부 대안은 UWP 앱에서 Windows API의 대안에서 찾을 수 있습니다.Some alternatives can be found at Alternatives to Windows APIs in UWP apps.

유니버설 Windows 프로젝트의 참조를 클래식 데스크톱 라이브러리에 추가하려고 하면 라이브러리가 호환되지 않는다는 오류 메시지가 표시됩니다.If you just try to add a reference from a Universal Windows Project to a classic desktop library, you get an error message that says the library is not compatible. 정적 라이브러리의 경우 클래식 Win32 응용 프로그램에서와 마찬가지로 라이브러리(.lib 파일)를 링커 입력에 추가하기만 하여 라이브러리에 링크할 수 있습니다.In the case of a static library, you can link to your library simply by adding the library (.lib file) to your linker input, just as you would in a classic Win32 application. 바이너리만 사용할 수 있는 라이브러리의 경우 이것이 유일한 옵션입니다.For libraries where only a binary is available, this is the only option. 정적 라이브러리는 앱의 실행 파일에 링크되지만 UWP 앱에서 사용하는 Win32 DLL은 프로젝트에 포함하고 콘텐츠로 표시하여 앱에 패키지해야 합니다.A static library is linked into your app's executable, but a Win32 DLL that you consume in a UWP app must be packaged into the app by including it in the project and marking it as Content. UWP 앱에서 Win32 DLL을 로드하려면 LoadLibrary 또는 LoadLibraryEx 대신 LoadPackagedLibrary도 호출해야 합니다.To load a Win32 DLL in a UWP app, you also have to call LoadPackagedLibrary instead of LoadLibrary or LoadLibraryEx.

DLL 또는 정적 라이브러리의 소스 코드가 있는 경우 /ZW를 사용하여 UWP 프로젝트로 다시 컴파일할 수 있습니다.If you have source code for the DLL or static library, you can recompile with /ZW as a UWP project. 이렇게 하면 솔루션 탐색기를 사용하여 참조를 추가하고 C++ UWP 앱에서 사용할 수 있습니다.If you do that, you can add a reference using the Solution Explorer, and use it in C++ UWP apps. DLL의 경우 내보내기 라이브러리에 링크합니다.In the case of a DLL, you link with the export library.

다른 언어로 호출자에게 기능을 노출하기 위해 라이브러리를 Windows 런타임 구성 요소로 변환할 수 있습니다.To expose functionality to callers in other languages, you can convert the library into a Windows Runtime Component. Windows 런타임 구성 요소는 .NET 및 JavaScript 소비자가 요구하는 방식으로 콘텐츠를 설명하는 .winmd 파일의 형태로 메타데이터를 포함한다는 점에서 일반적인 DLL과 다릅니다.Windows Runtime Components differ from ordinary DLLs in that they include metadata in the form of .winmd files which describe the contents in a way that .NET and JavaScript consumers require. API 요소를 다른 언어에 노출하기 위해 ref 클래스와 같은 C++/CX 구문을 추가하고 클래스를 공용으로 만들거나 WRL(Windows 런타임 C++ 템플릿 라이브러리)을 사용할 수 있습니다.To expose API elements to other languages, you can add C++/CX constructs, such as ref classes, and make them public, or use the Windows Runtime C++ Template Library (WRL). Windows 10 이상 버전에서는 C++/CX 대신 C++/WinRT 라이브러리를 사용할 수 있습니다.In Windows 10 and later, you can use the C++/WinRT library instead of C++/CX.

앞의 설명은 다르게 처리되어야 하는 COM 구성 요소의 경우에는 적용되지 않습니다.The preceding discussion doesn't apply to the case of COM components, which must be handled differently. EXE 또는 DLL에 COM 서버가 있는 경우 등록이 필요하지 않은 COM 구성 요소로 패키지하는 한 유니버설 Windows 프로젝트에서 사용할 수 있으며 콘텐츠 파일로 프로젝트에 추가하고 CoCreateInstanceFromApp을 사용하여 인스턴스화할 수 있습니다.If you have a COM server in an EXE or DLL, you can use it in a Universal Windows Project as long as you package it as a registration-free COM component, add it to your project as a Content file, and instantiate it using CoCreateInstanceFromApp. Windows 스토어 C++ 프로젝트에서 Free-COM DLL 사용을 참조하세요.See Using Free-COM DLL in Windows Store C++ Project.

UWP로 포팅하려는 기존 COM 라이브러리가 있는 경우 WRL(Windows 런타임 C++ 템플릿 라이브러리)을 사용하여 Windows 런타임 구성 요소로 변환할 수 있습니다.If you have an existing COM library that you want to port to the UWP, you might be able to convert it into a Windows Runtime Component by using the Windows Runtime C++ Template Library (WRL). WRL은 ATL 및 OLE의 모든 기능을 지원하지 않으므로 이러한 포트가 적합한지 여부는 COM 코드가 구성 요소에 필요한 COM, ATL 및 OLE의 어떤 기능에 얼마나 많이 의존하는지에 따라 달라집니다.The WRL does not support all the features of ATL and OLE, so whether such a port is feasible depends on how much your COM code depends on what features of COM, ATL, and OLE your component requires.

이들은 UWP 프로젝트에서 기존 C++ 코드를 사용할 수 있는 다양한 방법입니다.These are the various ways that you can use existing C++ code in UWP projects. 구성 요소 확장(C++/CX)을 사용하도록 설정하여(즉, /ZW 옵션을 사용하여) 코드를 다시 컴파일할 필요가 없는 방법도 있지만 그렇지 않은 방법도 있으므로 표준 C++로 코드를 유지해야 하거나 일부 코드의 경우 클래식 Win32 컴파일 환경을 보존해야 하는 경우 적절한 아키텍처를 선택하여 그렇게 할 수 있습니다.Some ways do not require code to be recompiled with the component extensions (C++/CX) enabled (that is, with the /ZW option), and some do, so if you need to keep code in standard C++, or preserve a classic Win32 compilation environment for some code, you can do so, with appropriate architecture choices. 예를 들어 C#, Visual Basic 및 JavaScript 호출자에게 노출될 UWP UI 및 형식을 포함하는 모든 코드는 Windows 앱 프로젝트와 Windows 런타임 구성 요소 프로젝트에 있어야 합니다.For example, all your code that contains UWP UI and types that are to be exposed to C#, Visual Basic, and JavaScript callers should be in Windows App projects and Windows Runtime Component projects. C++(C++/CX 포함) 코드에서만 소비되어야 하는 코드는 /WX 옵션을 사용하여 컴파일되는 프로젝트나 표준 C++ 프로젝트에 있을 수 있습니다.Code that needs to be consumed only in C++ (including C++/CX) code can either be in a project that compiles with the /WX option or a standard C++ project. 바이너리 전용 코드는 금지된 API를 사용하지 않는 경우에만 정적 라이브러리로 링크하여 사용하거나 콘텐츠로 앱과 함께 패키지하고 DLL에서 로드할 수 있습니다.Binary-only code can be used by linking it in as a static library, or packaged with the app as content and loaded in a DLL only if it doesn't use forbidden APIs.

이러한 개발 시나리오 중 어느 것을 선택하든 간에 클래식 데스크톱 Win32와 UWP 모두에서 조건부로 코드를 컴파일할 수 있도록 하기 위해 코드에서 사용할 수 있는 많은 매크로 정의를 알고 있어야 합니다.Regardless of which of these development scenarios you choose, you should be aware of a number of macro definitions that you can use in your code so that you can compile code conditionally under both classic desktop Win32 and UWP.

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PC_APP)  
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)  
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)  
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)  

이러한 문은 각각 UWP 앱, Windows Phone 스토어 앱 중 하나 또는 둘 다에 적용되거나 적용되지 않습니다(클래식 Win32 데스크톱만 해당).These statements respectively apply to UWP apps, Windows Phone Store apps, both, or neither (classic Win32 desktop only). 이러한 매크로는 Windows SDK 8.1 이상에서만 사용할 수 있으므로 이전 버전의 Windows SDK 또는 Windows 이외의 다른 플랫폼 용으로 코드를 컴파일해야 하면 이러한 매크로가 정의되지 않은 경우도 고려해야 합니다.These macros are only available in Windows SDK 8.1 and later, so if your code needs to compile with earlier versions of the Windows SDK or for other platforms besides Windows, then you should also consider the case that none of them are defined.

이 항목에는 다음과 같은 절차가 포함되어 있습니다.This topic contains the following procedures.

  1. UWP 앱에서 Win32 DLL 사용하기Using a Win32 DLL in a UWP App

  2. UWP 앱에서 네이티브 C++ 정적 라이브러리 사용Using a native C++ static library in a UWP App

  3. Windows 런타임 구성 요소로 C++ 라이브러리 포팅Porting a C++ Library to a Windows Runtime Component

UWP 앱에서 Win32 DLL 사용하기Using a Win32 DLL in a UWP App

보안과 안정성을 높이기 위해 유니버설 Windows 앱은 제한된 런타임 환경에서 실행되므로 클래식 Windows 데스크톱 응용 프로그램에서 사용하듯이 네이티브 DLL을 사용할 수 없습니다.For better security and reliability, Universal Windows Apps run in a restricted runtime environment, so you can't just use any native DLL the way you would in a classic Windows desktop application. DLL의 소스 코드가 있는 경우 UWP에서 실행되도록 코드를 이식할 수 있습니다.If you have source code for a DLL, you can port the code so that it runs on the UWP. 먼저 프로젝트를 UWP 프로젝트로 식별하기 위해 몇 가지 프로젝트 설정과 프로젝트 파일 메타데이터를 변경합니다.You start by changing a few project settings and project file metadata to identify the project as a UWP project. C++/CX를 사용하도록 설정하는 /ZW 옵션을 사용하여 라이브러리 코드를 컴파일해야 합니다.You need to compile the library code using the /ZW option, which enables C++/CX. 특정 API 코드는 해당 환경과 관련된 더 엄격한 제어 때문에 UWP 앱에서 허용되지 않습니다.Certain API calls are not allowed in UWP apps due to stricter controls associated with that environment. Windows 런타임 앱 및 UWP(유니버설 Windows 플랫폼) 앱용 Win32 및 COM을 참조하세요.See Win32 and COM for Windows Runtime apps and Universal Windows Platform (UWP) apps.

__declspec(dllexport)를 사용하여 함수를 노출하는 네이티브 DLL이 있는 경우에는 다음 절차가 적용됩니다.The following procedure applies to the case where you have a native DLL that exposes functions using __declspec(dllexport).

새 프로젝트를 만들지 않고 네이티브 DLL을 UWP로 이식하려면To port a native DLL to the UWP without creating a new project

  1. __declspec(dllexport)을 사용하여 함수를 내보내는 네이티브 DLL이 있는 경우 DLL을 UWP 프로젝트로 다시 컴파일하여 UWP 앱에서 해당 함수를 호출할 수 있습니다.If you have a native DLL that exports functions by using __declspec(dllexport), you can call those functions from a UWP app by recompiling the DLL as a UWP project. 예를 들어 다음 헤더 파일과 같은 코드를 사용하며 몇 가지 클래스와 해당 메서드를 내보내는 DLL이 있으며For example, suppose we have a DLL that exports a couple of classes and their methods, with code like the following header file:

    // giraffe.h  
    #pragma once  
    
    #ifdef _DLL  
    #define GIRAFFE_API __declspec(dllexport)  
    #else  
    #define GIRAFFE_API   
    #endif  
    
    GIRAFFE_API int giraffeFunction();  
    
    class Giraffe  
    {  
        int id;  
            Giraffe(int id_in);  
        friend class GiraffeFactory;  
    
    public:  
        GIRAFFE_API int GetID();  
    };  
    
    class GiraffeFactory  
    {  
        static int nextID;  
    
    public:  
        GIRAFFE_API GiraffeFactory();  
        GIRAFFE_API static int GetNextID();  
        GIRAFFE_API static Giraffe* Create();  
    };  
    

    다음 코드 파일이 있다고 가정합니다.And the following code file:

    // giraffe.cpp  
    #include "stdafx.h"  
    #include "giraffe.h"  
    
    Giraffe::Giraffe(int id_in) : id(id_in)  
    {  
    }  
    
    int Giraffe::GetID()  
    {  
      return id;  
    }  
    
    int GiraffeFactory::nextID = 0;  
    
    GiraffeFactory::GiraffeFactory()  
    {  
        nextID = 0;  
    }  
    
    int GiraffeFactory::GetNextID()  
    {  
        return nextID;  
    }  
    
    Giraffe* GiraffeFactory::Create()  
    {  
        return new Giraffe(nextID++);  
    }  
    
    int giraffeFunction();  
    

    프로젝트의 모든 항목(stdafx.h, dllmain.cpp)은 표준 Win32 프로젝트 템플릿의 일부입니다.Everything else in the project (stdafx.h, dllmain.cpp) is part of the standard Win32 project template. 자체 DLL을 사용하지 않고 이 작업을 진행하려면 Win32 프로젝트를 만들고, 프로젝트 마법사에서 DLL을 선택한 다음 헤더 파일 giraffe.h 및 코드 파일 giraffe.cpp를 추가하고 이 단계의 코드 내용을 해당 파일로 복사합니다.If you want to follow along, but don't want to use your own DLL yet with these steps, try creating a Win32 project, select DLL in the project wizard, and then add a header file giraffe.h and code file giraffe.cpp, and copy the contents from the code in this step into the appropriate files.

    이 코드는 _DLL이 정의될 때(즉, 프로젝트가 DLL로 빌드됨) __declspec(dllexport)로 확인되는 매크로 GIRAFFE_API를 정의합니다.The code defines the macro GIRAFFE_API which resolves to __declspec(dllexport) when _DLL is defined (that is, when the project is built as a DLL).

  2. DLL 프로젝트에 대한 프로젝트 속성을 열고 구성을 모든 구성으로 설정합니다.Open the Project Properties for the DLL project, and set the Configuration to All Configurations.

  3. 프로젝트 속성의 C/C++, 일반 탭에서 Windows 런타임 확장 사용예(/ZW) 로 설정합니다.In the Project Properties, under C/C++, General tab, set Consume Windows Runtime Extension to Yes (/ZW). 이렇게 하면 구성 요소 확장명(C++/CX)이 활성화됩니다.This enables component extensions (C++/CX).

  4. 솔루션 탐색기에서 프로젝트 노드를 선택하고 바로 가기 메뉴를 연 다음 프로젝트 언로드를 선택합니다.In Solution Explorer, select the project node, open the shortcut menu and choose Unload Project. 그런 다음 언로드된 프로젝트 노드에서 바로 가기 메뉴를 열고 프로젝트 파일을 편집하도록 선택합니다.Then, open the shortcut menu on the unloaded project node, and choose to edit the project file. WindowsTargetPlatformVersion 요소를 찾아 다음 요소로 바꿉니다.Locate the WindowsTargetPlatformVersion element and replace it with the following elements.

    <AppContainerApplication>true</AppContainerApplication>  
    <ApplicationType>Windows Store</ApplicationType>  
    <WindowsTargetPlatformVersion>10.0.10156.0</WindowsTargetPlatformVersion>  
    <WindowsTargetPlatformMinVersion>10.0.10156.0</WindowsTargetPlatformMinVersion>  
    <ApplicationTypeRevision>10.0</ApplicationTypeRevision>  
    

    .vcxproj 파일을 닫고 바로 가기 메뉴를 다시 연 다음 프로젝트 다시 로드를 선택합니다.Close the .vcxproj file, open the shortcut menu again and choose Reload Project.

    이제 솔루션 탐색기에 프로젝트가 유니버설 Windows 프로젝트로 식별됩니다.Solution Explorer now identifies the project as a Universal Windows project.

  5. 미리 컴파일된 헤더 파일 이름이 올바른지 확인합니다.Make sure your precompiled header file name is correct. 미리 컴파일된 헤더 섹션에서 미리 컴파일된 헤더 파일을 pch.h에서 stdafx.h로 변경합니다.In the Precompiled Headers section, change Precompiled Header File from pch.h to stdafx.h. 이렇게 하지 않으면 다음과 같은 오류가 표시됩니다.If you don't do this, you see the following error.

    error C2857: '#include' statement specified with the /Ycpch.h command-line option was not found in the source file  
    

    문제는 유니버설 Windows 프로젝트가 미리 컴파일된 헤더 파일에 다른 명명 규칙을 사용한다는 것입니다.The issue is that the Universal Windows projects use a different naming convention for the precompiled header file.

  6. 프로젝트를 빌드합니다.Build the project. 호환되지 않는 명령줄 옵션에 대한 몇 가지 오류가 발생할 수도 있습니다.You might get some errors about incompatible command line options. 예를 들어 자주 사용되는 옵션인 “최소 다시 빌드 가능(/Gm)”은 기본적으로 많은 C++ 프로젝트에서 설정되며 /ZW와 호환되지 않습니다.For example, the frequently used option Enable Minimal Rebuild (/Gm) is set by default in many C++ projects, and is incompatible with /ZW.

    유니버설 Windows 플랫폼용으로 컴파일할 경우 일부 기능을 사용할 수 없습니다.Some functions are not available when you compile for the Universal Windows Platform. 모든 문제에 대한 컴파일러 오류가 표시됩니다.You will see compiler errors about any problems. 클린 빌드를 수행할 때까지 이러한 문제를 해결하세요.Address these until you have a clean build.

  7. 동일한 솔루션의 UWP 앱에서 DLL을 사용하려면 UWP 프로젝트 노드에 대한 바로 가기 메뉴를 열고 추가, 참조를 선택합니다.To use the DLL in a UWP app in the same solution, open the shortcut menu for the UWP project node, and choose Add, Reference.

    프로젝트, 솔루션 아래에서 DLL 프로젝트 옆의 확인란을 선택하고 확인 단추를 선택합니다.Under Projects, Solution, select the checkbox next to the DLL project, and choose the OK button.

  8. UWP 앱의 pch.h 파일에 라이브러리 헤더 파일을 포함합니다.Include the library's header file(s) in your UWP app's pch.h file.

    #include "..\MyNativeDLL\giraffe.h"  
    
  9. 함수를 호출하고 DLL에서 형식을 만드는 코드를 UWP 프로젝트에서 일반적인 방식으로 추가합니다.Add code as usual in the UWP project to invoke functions and create types from the DLL.

    MainPage::MainPage()  
    {  
        InitializeComponent();  
        GiraffeFactory gf;  
        Giraffe* g = gf.Create();  
        int id = g->GetID();  
    }  
    

UWP 앱에서 네이티브 C++ 정적 라이브러리 사용Using a native C++ static library in a UWP App

UWP 프로젝트에서 네이티브 C++ 정적 라이브러리를 사용할 수 있지만 알아두어야 할 몇 가지 제한 사항이 있습니다.You can use a native C++ static library in a UWP project, but there are some restrictions and limitations to be aware of. 먼저 이 항목에서 C++/CX의 정적 라이브러리에 대한 내용을 읽습니다.Start by reading this topic about static libraries in C++/CX. UWP 앱에서 정적 라이브러리의 네이티브 코드에 액세스할 수 있지만 이러한 정적 라이브러리에서는 공용 ref 형식을 만들지 않는 것이 좋습니다.You can access the native code in your static library from your UWP app, but it's not recommended to create public ref types in such a static library. /ZW 옵션을 사용하여 정적 라이브러리를 컴파일하는 경우 라이브러리 관리자(실제로는 가장된 링커)는 다음과 같이 경고합니다.If you compile a static library with the /ZW option, the librarian (actually the linker in disguise) warns:

LNK4264: archiving object file compiled with /ZW into a static library; note that when authoring Windows Runtime types it is not recommended to link with a static library that contains Windows Runtime metadata  

그러나 /ZW를 사용하여 다시 컴파일하지 않고 UWP에서 정적 라이브러리를 사용할 수 있습니다.However, you can use a static library in a UWP without recompiling it with /ZW. ref 형식을 선언하거나 C++/CX 구문을 사용할 수 없게 되지만, 네이티브 코드의 라이브러리를 사용하기만 하면 되는 경우에는 다음 단계를 수행하여 사용할 수 있습니다.You won't be able to declare any ref types or use C++/CX constructs, but if your purpose is to simply use library of native code, then you can do so by following these steps.

UWP 프로젝트에서 네이티브 C++ 정적 라이브러리를 사용하려면To use a native C++ static library in a UWP project

  1. UWP 프로젝트에 대한 프로젝트 속성의 링커 섹션에서 입력 속성에 라이브러리 경로를 추가합니다.In the project properties for the UWP project, in the Linker section, add the path to the library in the Input property. 예를 들어 출력을 SolutionFolder\Debug\MyNativeLibrary\MyNativeLibrary.lib에 배치하는 프로젝트 라이브러리의 경우 상대 경로 Debug\MyNativeLibrary\MyNativeLibrary.lib를 추가합니다.For example, for a library in the project that places its output in SolutionFolder\Debug\MyNativeLibrary\MyNativeLibrary.lib, add the relative path Debug\MyNativeLibrary\MyNativeLibrary.lib.

  2. UWP 프로젝트에서 헤더 파일 pch.h를 참조하는 include 문을 추가하고 라이브러리를 사용하는 코드를 추가하기 시작합니다.Add an include statement to reference the header file to your pch.h in the UWP project and start adding code that uses the library.

    #include "..\MyNativeLibrary\giraffe.h"  
    

    솔루션 탐색기참조 노드에서 참조를 추가하지 마세요.Do not add a reference in the References node in Solution Explorer. 해당 메커니즘은 Windows 런타임 구성 요소에만 적용됩니다.That mechanism only works for Windows Runtime Components.

Windows 런타임 구성 요소로 C++ 라이브러리 포팅Porting a C++ Library to a Windows Runtime Component

UWP 앱의 정적 라이브러리에서 네이티브 API를 사용하려는 경우 네이티브 라이브러리의 소스 코드가 있으면 해당 코드를 Windows 런타임 구성 요소로 이식할 수 있습니다.If you want to consume native APIs in a static library from a UWP app, and you have the source code for the native library, you can port the code to a Windows Runtime Component. 이 라이브러리는 더 이상 정적 라이브러리가 아니며 DLL이 됩니다.It won't be a static library anymore, it will be a DLL. 모든 C++ UWP 앱에서 이 라이브러리를 사용할 수 있지만, 정적 라이브러리의 경우와 달리 언어에 관계없이 모든 UWP 앱 코드에서 클라이언트가 사용할 수 있는 ref 형식 및 다른 C++/CX 구문을 추가할 수 있습니다.You can use it in any C++ UWP app, but unlike the case of static library, you can add ref types and other C++/CX constructs which are available to clients in any UWP app code, regardless of language. 따라서 C#, Visual Basic 또는 JavaScript에서 이러한 형식에 액세스할 수 있습니다.Therefore, you can access these types from C#, Visual Basic, or JavaScript. 기본 절차는 Windows 런타임 구성 요소 프로젝트를 만들고 여기에 정적 라이브러리에 대한 코드를 추가한 다음 표준 C++ 컴파일에서 /ZW 컴파일로 코드를 이동할 때 발생하는 모든 오류를 해결하는 것입니다.The basic procedure is to create a Windows Runtime Component project, copy the code for your static library into it, and address any errors that arise from moving the code from a standard C++ compilation to a /ZW compilation.

Windows 런타임 구성 요소로 C++ 라이브러리를 이식하려면To port a C++ library to a Windows Runtime Component

  1. Windows 런타임 구성 요소 프로젝트를 만듭니다.Create a Windows Runtime Component project.

  2. 프로젝트를 닫습니다.Close the project.

  3. Windows 파일 탐색기에서 프로젝트를 찾습니다.In the Windows File Explorer, locate the project. 기본적으로 Visual Studio에서는 문서 폴더에서 Visual Studio 2017\Projects 폴더를 사용합니다.By default, Visual Studio uses the Visual Studio 2017\Projects folder in your Documents folder. 이식하려는 코드가 포함된 C++ 라이브러리 프로젝트를 찾습니다.Locate the C++ library project that contains the code you want to port. C++ 라이브러리에서 소스 파일(하위 디렉터리에 포함된 헤더 파일, 코드 파일 및 다른 모든 리소스)을 복사하여 프로젝트 폴더에 붙여 넣습니다. 이때 동일한 폴더 구조를 유지해야 합니다.Copy the source files (header files, code files, and any other resources, including in subdirectories) from your C++ library project, and paste them into the project folder, making sure to preserve the same folder structure.

  4. Windows 런타임 구성 요소 프로젝트를 다시 열고 솔루션 탐색기에서 프로젝트 노드에 대한 바로 가기 메뉴를 연 다음 추가, 기존 항목을 선택합니다.Reopen the Windows Runtime Component project, and open the shortcut menu for the project node in Solution Explorer, and choose Add, Existing Item.

  5. 원래 프로젝트에서 추가할 모든 파일을 선택하고 확인을 선택합니다.Select all the files to add from your original project, and choose OK. 필요한 경우 하위 폴더를 대상으로 반복합니다.Repeat if necessary for subfolders.

  6. 이제 중복된 일부 코드가 있을 수도 있습니다.You might now have some duplicated code. 미리 컴파일된 헤더(예: stdafx.h 및 pch.h)가 두 개 이상 있으면 유지할 헤더를 하나만 선택합니다.If you have more than one precompiled header (say stdafx.h and pch.h), choose one to keep. 유지할 헤더에 include 문과 같은 필요한 코드를 복사합니다.Copy any required code, such as include statements, into the one you're keeping. 그런 다음 다른 헤더를 삭제하고 프로젝트 속성의 미리 컴파일된 헤더에서 헤더 파일의 이름이 올바른지 확인합니다.Then, delete the other, and in the project properties, under Precompiled Headers, make sure that the name of the header file is correct.

    미리 컴파일된 헤더로 사용할 파일을 변경한 경우 각 파일에 대한 미리 컴파일된 헤더 옵션이 올바른지 확인합니다.If you changed the file to use as the precompiled header, make sure that the precompiled header options are correct for each file. 각 .cpp 파일을 차례로 선택하고 속성 창을 연 다음 만들기(/Yc) 로 설정되어야 하는 원하는 미리 컴파일된 헤더를 제외하고 모두 사용(/Yu) 으로 설정되어 있는지 확인합니다.Select each .cpp file in turn, open its properties window, and make sure that all are set to Use (/Yu), except for the desired precompiled header, which should be set to Create (/Yc).

  7. 프로젝트를 빌드하고 모든 오류를 해결합니다.Build the project and resolve any errors. 이러한 오류는 /ZW 옵션을 사용하기 때문에 발생하거나 새로운 버전의 Windows SDK로 인해 발생할 수 있습니다. 또는 라이브러리가 종속된 헤더 파일과 같은 종속성이나 이전 프로젝트와 새 프로젝트 간의 프로젝트 설정 차이를 반영할 수도 있습니다.These errors could be caused by using the /ZW option, or they could be caused by a new version of the Windows SDK, or they might reflect dependencies such as header files that your library depends on, or differences in project settings between your old project and the new one.

  8. 공용 ref 형식을 프로젝트에 추가하거나 일반 형식을 ref 형식으로 변환하여 UWP 앱에서 호출하려는 기능에 대한 진입점을 노출합니다.Add public ref types to your project, or convert ordinary types to ref types, to expose entry points into the functionality you want to call from UWP apps.

  9. UWP 앱 프로젝트에서 구성 요소에 대한 참조를 추가하여 구성 요소를 테스트하고 만든 공용 API를 호출하는 코드를 추가합니다.Test the component by adding a reference to it from a UWP app project, and add some code to call the public APIs you created.

참고 항목See Also

유니버설 Windows 플랫폼으로 포팅Porting to the Universal Windows Platform