Vorgehensweise: Verwenden von vorhandenem C++-Code in einer universelle Windows-Plattform-AppHow to: Use Existing C++ Code in a Universal Windows Platform App

Die einfachste Möglichkeit, für die Ausführung Ihres Desktop-Programms in der UWP-Umgebung (Universelle Windows-Plattform) zu sorgen, ist der Einsatz von Desktop-Brücke-Technologien.Perhaps the easiest way to get your desktop program running in the Universal Windows Platform (UWP) environment is to use the Desktop Bridge technologies. Zu diesen gehört der Desktop App Converter, der Ihre vorhandene Anwendung als UWP-App packt, ohne dass Codeänderungen erforderlich sind.These include the Desktop App Converter, which will package your existing application as a UWP app with no code changes required. Weitere Informationen finden Sie unter Desktop Bridge.For more information, see Desktop Bridge.

Im weiteren Verlauf dieses Artikels wird das Portieren von C++-Bibliotheken (DLLs und statischen Bibliotheken) auf die Universelle Windows-Plattform erläutert.The rest of this topic discusses how to port C++ libraries (DLLs and static libraries) to the Universal Windows Platform. Dieser Vorgang ermöglicht, dass Ihre wesentliche C++-Logik in mehreren UWP-Apps verwendet werden kann.You might want to do this so that your core C++ logic can be used with multiple UWP apps.

UWP-Apps werden in einer geschützten Umgebung ausgeführt. Daher sind viele Win32-, COM- und CRT-API-Aufrufe, die die Sicherheit der Plattform gefährden können, nicht zulässig.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. Der Compiler kann diese Aufrufe erkennen und gibt einen Fehler aus, falls die Option /ZW verwendet wird.The compiler can detect such calls and generate an error, if the /ZW option is used. Sie können das Zertifizierungskit für Apps auf Ihre Anwendung anwenden, um Code mit unzulässigen API-Aufrufen zu erkennen.You can use the App Certification Kit on your application to detect code that calls forbidden APIs. Weitere Informationen finden Sie unter Zertifizierungskit für Windows-Apps.For more information, see Windows App Certification Kit.

Wenn der Quellcode für die Bibliothek verfügbar ist, können Sie unzulässige API-Aufrufe möglicherweise beseitigen.If source code is available for the library, you might be able to eliminate the forbidden API calls. Details einschließlich einer Liste der zulässigen bzw. unzulässigen APIs finden Sie unter Win32 and COM APIs for UWP apps (Win32- und COM-API für Universal Windows Platform-Apps (UWP)) und CRT functions not supported in Universal Windows Platform apps (In UWP-Apps nicht unterstützte CRT-Funktionen).For details including a list of APIs that are allowed or forbidden, see Win32 and COM APIs for UWP apps and CRT functions not supported in Universal Windows Platform apps. Einige Alternativen finden Sie unter Alternatives to Windows APIs in UWP apps (Alternativen zu Windows-APIs in UWP-Apps).Some alternatives can be found at Alternatives to Windows APIs in UWP apps.

Sobald Sie versuchen, einen Verweis von einem universellen Windows-Projekt auf eine klassische Desktopbibliothek hinzuzufügen, erhalten Sie eine Fehlermeldung, die besagt, dass die Bibliothek nicht kompatibel ist.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. Bei einer statischen Bibliothek können Sie ganz einfach einen Link auf Ihre Bibliothek erstellen, indem Sie die Bibliothek (LIB-Datei) zu Ihrer Linkereingabe hinzufügen, genau wie in einer klassischen Win32-Anwendung.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. Bei Bibliotheken, für die nur eine Binärdatei verfügbar ist, ist dies die einzige Option.For libraries where only a binary is available, this is the only option. Eine statische Bibliothek wird mit der ausführbaren Datei Ihrer App verknüpft, aber eine Win32-DLL, die Sie in einer UWP-App nutzen, muss in die App gepackt werden, indem sie in das Projekt eingeschlossen und als Inhalt markiert wird.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. Wenn Sie eine Win32-DLL in einer UWP-App laden möchten, müssen Sie außerdem LoadPackagedLibrary anstelle von LoadLibrary oder LoadLibraryEx aufrufen.To load a Win32 DLL in a UWP app, you also have to call LoadPackagedLibrary instead of LoadLibrary or LoadLibraryEx.

Wenn Sie über den Quellcode für die DLL oder die statische Bibliothek verfügen, können Sie sie mit /ZW als UWP-Projekt neu kompilieren.If you have source code for the DLL or static library, you can recompile with /ZW as a UWP project. Wenn Sie dies tun, können Sie einen Verweis mit dem Projektmappen-Explorerhinzufügen und in C++-UWP-Apps verwenden.If you do that, you can add a reference using the Solution Explorer, and use it in C++ UWP apps. Im Fall einer DLL erstellen Sie einen Link mit der Exportbibliothek.In the case of a DLL, you link with the export library.

Um Funktionalität für Aufrufer in anderen Sprachen verfügbar zu machen, können Sie die Bibliothek in eine Komponente für Windows-Runtime konvertieren.To expose functionality to callers in other languages, you can convert the library into a Windows Runtime Component. Komponenten für Windows-Runtime unterscheiden sich insofern von normalen DLLs, als sie Metadaten in Form von WINMD-Dateien enthalten, die den Inhalt auf eine Weise beschreiben, die von .NET und JavaScript-Consumern benötigt wird.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. Um API-Elemente für andere Sprachen verfügbar zu machen, können Sie C++/CX-Konstrukte, wie z.B. Verweisklassen, hinzufügen und öffentlich machen bzw. die Windows Runtime C++ Template Library (WRL) verwenden.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). In Windows 10 und höher können Sie die C++/WinRT-Bibliothek anstelle von C++/CX verwenden.In Windows 10 and later, you can use the C++/WinRT library instead of C++/CX.

Die vorangegangenen Erläuterungen gelten nicht für COM-Komponenten. Diese müssen anders behandelt werden.The preceding discussion doesn't apply to the case of COM components, which must be handled differently. Wenn Sie über einen COM-Server in einer EXE oder DLL verfügen, können Sie ihn in einem universellen Windows-Projekt verwenden, sofern Sie ihn als registrierungsfreie COM-Komponente packen, dem Projekt als Inhaltsdatei hinzufügen und mit CoCreateInstanceFromApp instanziieren.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. Weitere Informationen finden Sie im Blogbeitrag Using Free-COM DLL in Windows Store C++ Project (Verwenden von Free-COM-DLLs in Windows Store-C++-Projekten).For more information, see Using Free-COM DLL in Windows Store C++ Project.

Wenn Sie eine vorhandene COM-Bibliothek auf die UWP portieren möchten, können Sie sie möglicherweise mit der Windows Runtime C++ Template Library (WRL) in eine Komponente für Windows-Runtime konvertieren.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). Die WRL unterstützt nicht alle Funktionen von ATL und OLE. Ob eine Portierung möglich ist, hängt davon ab, wie stark Ihr COM-Code von welchen COM-, ATL- und OLE-Funktionen abhängt.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.

Dies sind die verschiedenen Verwendungsmöglichkeiten für vorhandenen C++-Code in UWP-Projekten.These are the various ways that you can use existing C++ code in UWP projects. Einige Methoden erfordern die Neukompilierung des Codes mit aktivierten Komponentenerweiterungen (C++/CX, d.h. mit der Option /ZW), andere nicht. Wenn Sie daher Code in standardmäßigem C++ beibehalten oder eine klassische Win32-Kompilierungsumgebung für bestimmte Codeblöcke aufrechterhalten möchten, können Sie dies mit den entsprechenden Architekturoptionen tun.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. Beispielsweise sollte jeglicher Code, der UWP-Benutzeroberfläche und Typen enthält, die für C#-, Visual Basic- und JavaScript-Aufrufer verfügbar gemacht werden sollen, in Windows-App-Projekten und Windows-Runtime-Komponenten-Projekten enthalten sein.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. Code, der nur in C++-Code (einschließlich C++/CX) verwendet werden soll, kann entweder in einem Projekt, das mit der Option /WX kompiliert wird, oder in einem standardmäßigen C++-Projekt enthalten sein.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. Ausschließlich binärer Code kann durch Einbindung als statische Bibliothek verwendet oder mit der App als Inhalt gepackt und in eine DLL geladen werden, sofern keine unzulässigen APIs verwendet werden.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.

Unabhängig davon, welches dieser Entwicklungsszenarios Sie wählen, sollten Sie in jedem Fall eine Reihe von Makrodefinitionen kennen, die Sie in Ihrem Code verwenden können, damit Sie Code bedingt auf der klassischen Win32-Desktopplattform und UWP kompilieren können.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)

Diese Anweisungen gelten jeweils für UWP-Apps, Windows Phone Store-Apps, beide oder keines von beiden (nur klassische Win32-Desktop-Apps).These statements respectively apply to UWP apps, Windows Phone Store apps, both, or neither (classic Win32 desktop only). Diese Makros sind nur in Windows SDK 8.1 und höher verfügbar. Wenn Code mit früheren Versionen des Windows SDK oder für andere Plattformen als Windows kompiliert werden muss, sollten Sie daher auch den Fall berücksichtigen, dass sie nicht definiert sind.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.

Dieses Thema enthält die folgenden Verfahren:This topic contains the following procedures:

Verwenden einer Win32-DLL in einer UWP-AppUsing a Win32 DLL in a UWP App

Um eine höhere Sicherheit und Zuverlässigkeit zu erreichen, werden universelle Windows-Apps in einer eingeschränkten Runtime-Umgebung ausgeführt, damit Sie eine beliebige systemeigene DLL nicht genauso nutzen können, wie sie es in einer klassischen Windows-Desktopanwendung würden.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. Wenn Sie über Quellcode für eine DLL verfügen, können Sie den Code so portieren, dass er unter UWP ausgeführt werden kann.If you have source code for a DLL, you can port the code so that it runs on the UWP. Als Erstes ändern Sie einige Projekteinstellungen und Projektdatei-Metadaten, um das Projekt als UWP-Projekt zu identifizieren.You start by changing a few project settings and project file metadata to identify the project as a UWP project. Sie müssen den Bibliothekscode mit der Option /ZW kompilieren, sodass C++/CX aktiviert wird.You need to compile the library code using the /ZW option, which enables C++/CX. Bestimmte API-Aufrufe sind in UWP-Apps aufgrund strenger Kontrollen hinsichtlich der Umgebung nicht zulässig.Certain API calls are not allowed in UWP apps due to stricter controls associated with that environment. Weitere Informationen finden Sie unter Win32 and COM APIs for UWP apps (Win32- und COM-API für Universal Windows Platform-Apps (UWP)).See Win32 and COM APIs for UWP apps.

Das folgende Verfahren gilt, wenn Sie über eine native DLL verfügen, die Funktionen mit __declspec(dllexport) verfügbar macht.The following procedure applies to the case where you have a native DLL that exposes functions using __declspec(dllexport).

So portieren Sie eine systemeigene DLL auf UWP, ohne ein neues Projekt zu erstellenTo port a native DLL to the UWP without creating a new project

  1. Bei einer nativen DLL, die Funktionen mithilfe von __declspec(dllexport) exportiert, können Sie diese Funktionen aus einer UWP-App aufrufen, indem Sie die DLL als UWP-Projekt neu kompilieren.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. Nehmen wir beispielsweise an, wir haben eine DLL, die eine Reihe von Klassen und deren Methoden mit ähnlichem Code wie in der folgenden Header-Datei exportiert: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();
    };
    

    Und folgende Codedatei: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();
    

    Alles im Projekt (stdafx.h, dllmain.cpp) ist Teil der standardmäßigen Win32-Projektvorlage.Everything else in the project (stdafx.h, dllmain.cpp) is part of the standard Win32 project template. Wenn Sie das nachvollziehen möchten, jedoch zu diesem Zeitpunkt noch nicht Ihre eigene DLL mit diesen Schritten verwenden möchten, erstellen Sie ein Win32-Projekt, wählen Sie im Projekt-Asssistenten DLL, und fügen Sie dann als Headerdatei „giraffe.h“ und als Codedatei „giraffe.cpp“ hinzu. Kopieren Sie anschließend die Inhalte aus dem Code in diesem Schritt in die entsprechenden Dateien.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.

    Der Code definiert das Makro GIRAFFE_API, das zu __declspec(dllexport) aufgelöst wird, wenn _DLL definiert ist, also wenn das Projekt als DLL erstellt wird.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. Öffnen Sie die Projekteigenschaften für das DLL-Projekt, und legen Sie die Konfiguration auf Alle Konfigurationenfest.Open the Project Properties for the DLL project, and set the Configuration to All Configurations.

  3. Legen Sie in den Projekteigenschaften unter C/C++ > Allgemein (Registerkarte) die Option Windows-Runtime-Erweiterung verwenden auf Yes (/ZW) (Ja (/ZW)) fest.In the Project Properties, under C/C++ > General tab, set Consume Windows Runtime Extension to Yes (/ZW). Dadurch werden Komponentenerweiterungen (C++/CX) aktiviert.This enables component extensions (C++/CX).

  4. Wählen Sie im Projektmappen-Explorer den Projektknoten, öffnen Sie das Kontextmenü , und wählen Sie dann Projekt entladen aus.In Solution Explorer, select the project node, open the shortcut menu and choose Unload Project. Öffnen Sie anschließend das Kontextmenü des entladenen Projektknotens, und klicken Sie dann auf die Option zum Bearbeiten der Projektdatei.Then, open the shortcut menu on the unloaded project node, and choose to edit the project file. Suchen Sie das Element WindowsTargetPlatformVersion, und ersetzen Sie es durch die folgenden Elemente.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>
    

    Schließen Sie die VCXPROJ-Datei, öffnen Sie erneut das Kontextmenü, und wählen Sie Projekt erneut laden.Close the .vcxproj file, open the shortcut menu again and choose Reload Project.

    Der Projektmappen-Explorer identifiziert das Projekt jetzt als universelles Windows-Projekt.Solution Explorer now identifies the project as a Universal Windows project.

  5. Stellen Sie sicher, dass der Name der vorkompilierten Headerdatei richtig ist.Make sure your precompiled header file name is correct. Ändern Sie im Abschnitt Vorkompilierte Header die vorkompilierte Headerdatei von pch.h in stdafx.h.In the Precompiled Headers section, change Precompiled Header File from pch.h to stdafx.h. Wenn Sie dies nicht tun, wird die folgende Fehlermeldung angezeigt.If you don't do this, you see the following error.

    Fehler C2857: Die mit der Befehlszeilenoption /Ycpch.h angegebene „#include“-Anweisung konnte in der Quelldatei nicht gefunden werdenerror C2857: '#include' statement specified with the /Ycpch.h command-line option was not found in the source file

    Das Problem besteht darin, dass das universelle Windows-Projekt eine andere Namenskonvention für die vorkompilierte Headerdatei verwendet.The issue is that the Universal Windows projects use a different naming convention for the precompiled header file.

  6. Erstellen Sie das Projekt.Build the project. Sie erhalten möglicherweise einige Fehler zu nicht kompatiblen Befehlszeilenoptionen.You might get some errors about incompatible command line options. Die nun veraltete, aber häufig verwendete Option Minimale Neuerstellung aktivieren (/Gm) ist beispielsweise standardmäßig in vielen älteren C++-Projekten festgelegt und nicht mit /ZW kompatibel.For example, the now deprecated but frequently used option Enable Minimal Rebuild (/Gm) is set by default in many older C++ projects, and is incompatible with /ZW.

    Einige Funktionen sind nicht verfügbar, wenn Sie Etwas für die universelle Windows-Plattform kompilieren.Some functions are not available when you compile for the Universal Windows Platform. Zu allen Problemen werden Compilerfehler angezeigt.You will see compiler errors about any problems. Lösen Sie diese Fehler, bis Sie eine einwandfreie Version besitzen.Address these until you have a clean build.

  7. Um die DLL in einer UWP-App in derselben Lösung zu verwenden, öffnen Sie das Kontextmenü für den UWP-Projektknoten, und wählen SieReferenz hinzufügen > aus.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.

    Aktivieren Sie unter > Projektmappedas Kontrollkästchen neben dem DLL-Projekt, und wählen Sie die Schaltfläche OK aus. ProjectsUnder Projects > Solution, select the checkbox next to the DLL project, and choose the OK button.

  8. Fügen Sie die Headerdatei(n) der Bibliothek in die pch.h-Datei Ihrer UWP-App ein.Include the library's header file(s) in your UWP app's pch.h file.

    #include "..\MyNativeDLL\giraffe.h"
    
  9. Fügen Sie im UWP-Projekt wie gewohnt Code zum Aufrufen von Funktionen und Erstellen von Typen aus der DLL hinzu.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();
    }
    

Verwenden einer nativen, statischen C++-Bibliothek in einer UWP-AppUsing a native C++ static library in a UWP App

Sie können eine native statische C++-Bibliothek in einem UWP-Projekt verwenden, aber es gibt einige Einschränkungen zu beachten.You can use a native C++ static library in a UWP project, but there are some restrictions and limitations to be aware of. Lesen Sie zunächst mehr zu statischen Bibliotheken in C++/CX.Start by reading about static libraries in C++/CX. Sie können auf den nativen Code in Ihrer statischen Bibliothek aus Ihrer UWP-App zugreifen, aber es wird nicht empfohlen, öffentliche Verweistypen in einer solchen statischen Bibliothek zu erstellen.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. Wenn Sie eine statische Bibliothek mit der Option /ZW kompilieren, gibt der Bibliothekar (eigentlich der Linker) folgende Warnung aus: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 (LNK4264: Mit /ZW kompilierte Objektdatei wird in einer statischen Bibliothek archiviert. Beachten Sie, dass beim Erstellen von Windows-Runtime-Typen das Verknüpfen mit einer statischen Bibliothek, die Windows-Runtime-Metadaten enthält, nicht empfohlen wird.)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

Sie können eine statische Bibliothek jedoch in einer UWP-App ohne Neukompilieren mit /ZW verwenden.However, you can use a static library in a UWP without recompiling it with /ZW. Sie können dann keine Verweistypen deklarieren oder C++/CX-Konstrukte verwenden, aber wenn Sie nur eine Bibliothek mit systemeigenem Code verwenden möchten, können Sie dies mit den folgenden Schritten tun.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.

So verwenden Sie eine systemeigene, statische C++-Bibliothek in einem UWP-ProjektTo use a native C++ static library in a UWP project

  1. Wählen Sie in den Projekteigenschaften für das UWP-Projekt im linken Bereich Konfigurationseigenschaften-Linkereingabe > Linker > Input aus.In the project properties for the UWP project, choose Configuration Properties > Linker > Input in the left pane. Fügen Sie im rechten Bereich der Eigenschaft Zusätzliche Abhängigkeiten den Pfad zur Bibliothek hinzu.In the right pane, add the path to the library in the Additional Dependencies property. Beispiel: Für eine Bibliothek in dem Projekt, das seine Ausgabe in SolutionFolder\Debug\MyNativeLibrary\MyNativeLibrary.lib platziert, fügen Sie den relativen Pfad Debug\MyNativeLibrary\MyNativeLibrary.lib hinzu.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. Fügen Sie eine include-Anweisung hinzu, um die Headerdatei auf Ihre Datei pch.h (sofern vorhanden) oder eine CPP-Datei zu verweisen, und fügen Sie Code hinzu, der die Bibliothek verwendet.Add an include statement to reference the header file to your pch.h file (if present), or in any .cpp file as needed, and start adding code that uses the library.

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

    Fügen Sie keinen Verweis im Knoten Verweise im Projektmappen-Explorer hinzu.Do not add a reference in the References node in Solution Explorer. Dieser Mechanismus funktioniert nur für Komponenten für Windows-Runtime.That mechanism only works for Windows Runtime Components.

Portieren einer C++-Bibliothek in eine Komponente für Windows-RuntimePorting a C++ Library to a Windows Runtime Component

Wenn Sie systemeigene APIs in einer statischen Bibliothek aus einer UWP-App nutzen möchten und Sie über den Quellcode für die systemeigene Bibliothek verfügen, können Sie den Code in eine Komponente für Windows-Runtime portieren.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. Es ist dann keine statische Bibliothek mehr, sondern eine DLL.It won't be a static library anymore, it will be a DLL. Sie können diese in jeder C++-App für UWP verwenden. Im Gegensatz zur statischen Bibliothek können Sie jedoch auch Verweistypen und andere C++/CX-Konstrukte hinzufügen, die Clients unabhängig von der Sprache in UWP-App-Code zur Verfügung stehen.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. Daher können Sie auf diese Typen in C#, Visual Basic oder JavaScript zugreifen.Therefore, you can access these types from C#, Visual Basic, or JavaScript. Das grundlegende Verfahren besteht darin, ein Projekt für eine Komponente für Windows-Runtime zu erstellen, den Code für die statische Bibliothek in das Projekt zu kopieren und alle Fehler zu beheben, die beim Verschieben des Codes von einer standardmäßigen C++-Kompilierung zu einer /ZW-Kompilierung auftreten.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.

So portieren Sie eine C++-Bibliothek in eine Komponente für Windows-RuntimeTo port a C++ library to a Windows Runtime Component

  1. Erstellen Sie ein Projekt für eine Komponente für Windows-Runtime.Create a Windows Runtime Component project.

  2. Schließen Sie das Projekt.Close the project.

  3. Suchen Sie im Windows-Datei-Explorerdas Projekt.In the Windows File Explorer, locate the project. Standardmäßig verwendet Visual Studio den Ordner „Visual Studio 2017\Projects“ im Ordner „Dokumente“.By default, Visual Studio uses the Visual Studio 2017\Projects folder in your Documents folder. Suchen Sie das C++-Bibliotheksprojekt, das den Code enthält, den Sie portieren möchten.Locate the C++ library project that contains the code you want to port. Kopieren Sie die Quelldateien (Headerdateien, Codedateien und andere Ressourcen, auch in Unterverzeichnissen) aus dem C++-Bibliotheksprojekt, und fügen Sie sie in den Projektordner ein. Achten Sie dabei darauf, die gleiche Ordnerstruktur beizubehalten.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. Öffnen Sie das Projekt für die Komponente der Windows-Runtime erneut. Öffnen Sie im Projektmappen-Explorer das Kontextmenü für den Projektknoten, und klicken Sie auf Hinzufügen > Vorhandenes Element.Reopen the Windows Runtime Component project, and open the shortcut menu for the project node in Solution Explorer, and choose Add > Existing Item.

  5. Wählen Sie alle Dateien aus dem ursprünglichen Projekt aus, und wählen Sie OK.Select all the files to add from your original project, and choose OK. Wiederholen Sie dies ggf. für Unterordner.Repeat if necessary for subfolders.

  6. Möglicherweise ist der Code jetzt teilweise doppelt.You might now have some duplicated code. Wenn Sie mehr als einen vorkompilierten Header haben (z. B. stdafx.h und pch.h), wählen Sie einen Header aus, den Sie beibehalten möchten.If you have more than one precompiled header (say stdafx.h and pch.h), choose one to keep. Kopieren Sie allen erforderlichen Code, wie z. B. include-Anweisungen, in den beibehaltenen Header.Copy any required code, such as include statements, into the one you're keeping. Löschen Sie anschließend die anderen, und überprüfen Sie in den Projekteigenschaften unter Vorkompilierte Header, ob der Name der Headerdatei korrekt ist.Then, delete the other, and in the project properties, under Precompiled Headers, make sure that the name of the header file is correct.

    Wenn Sie die als vorkompilierten Header zu verwendende Datei geändert haben, überprüfen Sie, ob die Optionen für vorkompilierte Header für jede Datei korrekt sind.If you changed the file to use as the precompiled header, make sure that the precompiled header options are correct for each file. Wählen Sie nacheinander die einzelnen CPP-Dateien aus, öffnen Sie jeweils das Eigenschaftenfenster, und vergewissern Sie sich, dass alle auf Verwenden (/Yu) festgelegt sind, mit Ausnahme des gewünschten vorkompilierten Headers, der auf Erstellen (/Yc) festgelegt werden sollte.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. Erstellen Sie das Projekt, und beheben Sie alle Fehler.Build the project and resolve any errors. Diese Fehler können durch die Option /ZW oder durch eine neue Version des Windows SDK verursacht werden. Möglicherweise weisen sie auch auf Abhängigkeiten (z.B. Headerdateien, von denen Ihre Bibliothek abhängt) oder auf Unterschiede in den Projekteinstellungen zwischen dem alten und dem neuen Projekt hin.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. Fügen Sie Ihrem Projekt öffentliche Verweistypen hinzu, oder konvertieren Sie normale Typen in Verweistypen, um Einstiegspunkte in die Funktionalität verfügbar zu machen, die Sie von UWP-Apps aufrufen möchten.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. Testen Sie die Komponente, indem Sie in einem UWP-App-Projekt einen Verweis darauf erstellen, und fügen Sie Code zum Aufrufen der öffentlichen APIs hinzu, die Sie erstellt haben.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.

Siehe auchSee also

Portieren auf die universelle Windows-PlattformPorting to the Universal Windows Platform