Freigeben über


Exemplarische Vorgehensweise: Erstellen eines SDK mit C++

In dieser exemplarischen Vorgehensweise wird gezeigt, wie Sie ein systemeigenes C++-Mathematisches Bibliotheks-SDK erstellen, das SDK als Visual Studio-Erweiterung (VSIX) verpacken und dann zum Erstellen einer App verwenden. Die exemplarische Vorgehensweise ist in die folgenden Schritte unterteilt:

Voraussetzungen

Um dieser exemplarischen Vorgehensweise folgen zu können, müssen Sie das Visual Studio SDK installieren. Weitere Informationen finden Sie unter Visual Studio SDK.

So erstellen Sie die nativen und Windows-Runtime-Bibliotheken

  1. Klicken Sie in der Menüleiste auf Datei>Neu>Projekt.

  2. Erweitern Sie in der Liste der Vorlagen Visual C++>Windows Universal, und wählen Sie dann die DLL-Vorlage (Universelle Windows-Apps) aus. Geben Sie im Feld "Name " die Schaltfläche "OK" an NativeMath, und wählen Sie dann die Schaltfläche "OK " aus.

  3. Aktualisieren Sie NativeMath.h so, dass sie dem folgenden Code entspricht.

    #pragma once
    
    class __declspec(dllexport) BasicMath 
    {
    public:
        BasicMath();
        double add(double firstNumber, double secondNumber);
        double subtract(double firstNumber, double secondNumber);
    };
    
  4. Aktualisieren Sie NativeMath.cpp so, dass sie diesem Code entspricht:

    // NativeMath.cpp : Defines the exported functions for the DLL application.
    //
    
    #include "pch.h"
    #include "NativeMath.h"
    
    
    BasicMath::BasicMath()
    {
    }
    
    double BasicMath::add(double firstNumber, double secondNumber)
    {
        return firstNumber + secondNumber;
    }
    
    double BasicMath::subtract(double firstNumber, double secondNumber)
    {
        return firstNumber - secondNumber;
    }
    
  5. Öffnen Sie in Projektmappen-Explorer das Kontextmenü für die Projektmappe "NativeMath", und wählen Sie dann "Neues Projekt hinzufügen">aus.

  6. Erweitern Sie in der Liste der Vorlagen Visual C++, und wählen Sie dann die Windows-Runtime Component-Vorlage aus. Geben Sie im Feld "Name " die Schaltfläche "OK" an NativeMathWRT, und wählen Sie dann die Schaltfläche "OK " aus.

  7. Aktualisieren Sie Class1.h so, dass sie mit diesem Code übereinstimmt:

    #pragma once
    
    namespace NativeMathWRT
    {
        public ref class BasicMathWinMD sealed
        {
        public:
            BasicMathWinMD(){};
            double multiply(double firstNumber, double secondNumber);
            double divide(double firstNumber, double secondNumber);
        };
    }
    
  8. Aktualisieren Sie Class1.cpp so, dass sie diesem Code entspricht:

    // Class1.cpp
    #include "pch.h"
    #include "Class1.h"
    
    using namespace NativeMathWRT;
    using namespace Platform;
        
    double BasicMathWinMD::multiply(double firstNumber, double secondNumber)
    {
        return firstNumber * secondNumber;
    }
    
    double BasicMathWinMD::divide(double firstNumber, double secondNumber)
    {
        if(0 == secondNumber) 
            return -1;
    
        return firstNumber / secondNumber;
    }
    
  9. Wählen Sie auf der Menüleiste Erstellen>Projektmappe erstellen aus.

So erstellen Sie das NativeMathVSIX-Erweiterungsprojekt

  1. Öffnen Sie in Projektmappen-Explorer das Kontextmenü für die Projektmappe "NativeMath", und wählen Sie dann "Neues Projekt hinzufügen">aus.

  2. Erweitern Sie in der Liste der Vorlagen Visual C#>Extensibility, und wählen Sie dann VSIX-Projekt aus. Geben Sie im Feld "Name" "NativeMathVSIX" an, und wählen Sie dann die Schaltfläche "OK" aus.

  3. Öffnen Sie in Projektmappen-Explorer das Kontextmenü für source.extension.vsixmanifest, und wählen Sie dann "Code anzeigen" aus.

  4. Verwenden Sie den folgenden XML-Code, um den vorhandenen XML-Code zu ersetzen.

    <PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
      <Metadata>
        <Identity Id="NativeMathVSIX..c6b3cae1-e7e2-4e71-90f6-21017ea0dff7" Version="1.0" Language="en-US" Publisher="MyName" />
        <DisplayName>Native Math SDK</DisplayName>
        <Description>Native Math Library w/ Windows Runtime Additions</Description>
      </Metadata>
      <Installation Scope="Global" AllUsers="true">
        <InstallationTarget Id="Microsoft.ExtensionSDK" TargetPlatformIdentifier="Windows" TargetPlatformVersion="v8.0" SdkName="NativeMathSDK" SdkVersion="1.0" />
      </Installation>
      <Dependencies>
      </Dependencies>
      <Assets>
        <Asset Type="Microsoft.ExtensionSDK" d:Source="File" Path="SDKManifest.xml" />
      </Assets>
    </PackageManifest>
    
  5. Öffnen Sie in Projektmappen-Explorer das Kontextmenü für das NativeMathVSIX-Projekt, und wählen Sie dann "Neues Element hinzufügen">aus.

  6. Erweitern Sie in der Liste der Visual C#-Elemente "Daten", und wählen Sie dann "XML-Datei" aus. Geben Sie im Feld "Name " die Schaltfläche "OK" an SDKManifest.xml, und wählen Sie dann die Schaltfläche "OK " aus.

  7. Verwenden Sie diesen XML-Code, um den Inhalt der Datei zu ersetzen:

    <FileList
      Identity = "NativeMathSDK, Version=1.0"
      DisplayName = "Native Math SDK"
      MinVSVersion = "11.0"
      AppliesTo = "WindowsAppContainer + (CSharp | VB | VisualC)">
      <File Reference="NativeMathWRT.winmd" Implementation="NativeMathWRT.dll" />
    </FileList>
    
  8. Erstellen Sie in Projektmappen-Explorer unter dem NativeMathVSIX-Projekt diese Ordnerstruktur:

    \DesignTime
          \CommonConfiguration
                \Neutral
                      \Include
          \Debug
                \x86
    \Redist
          \Debug
                \x86
    \References
          \CommonConfiguration
                \Neutral
    
  9. Öffnen Sie in Projektmappen-Explorer das Kontextmenü für die Lösung "NativeMath", und wählen Sie dann "Ordner öffnen" in Explorer aus.

  10. Kopieren Sie in Explorer $SolutionRoot$\NativeMath\NativeMath.h, und fügen Sie sie dann im Projektmappen-Explorer unter dem Projekt NativeMathVSIX in den Ordner $SolutionRoot$\NativeMathVSIX\DesignTime\CommonConfiguration\Neutral\Include\ ein.

    Kopieren Sie $SolutionRoot$\Debug\NativeMath\NativeMath.lib, und fügen Sie sie dann in den Ordner $SolutionRoot$\NativeMathVSIX\DesignTime\Debug\x86\ ein.

    Kopieren Sie $SolutionRoot$\Debug\NativeMath\NativeMath.dll , und fügen Sie sie in den Ordner $SolutionRoot$\NativeMathVSIX\Redist\Debug\x86\ ein.

    Kopieren Sie $SolutionRoot$\Debug\NativeMathWRT\NativeMathWRT.dll , und fügen Sie sie in den Ordner $SolutionRoot$\NativeMathVSIX\Redist\Debug\x86 ein. Kopieren Sie $SolutionRoot$\Debug\NativeMathWRT\NativeMathWRT.winmd , und fügen Sie sie in den Ordner $SolutionRoot$\NativeMathVSIX\References\CommonConfiguration\Neutral ein.

    Kopieren Sie $SolutionRoot$\Debug\NativeMathWRT\NativeMathWRT.pri , und fügen Sie sie in den Ordner $SolutionRoot$\NativeMathVSIX\References\CommonConfiguration\Neutral ein.

  11. Erstellen Sie im Ordner $SolutionRoot$\NativeMathVSIX\DesignTime\Debug\x86\ eine Textdatei mit dem Namen NativeMathSDK.props, und fügen Sie dann den folgenden Inhalt darin ein:

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <NativeMathSDKPath>$(FrameworkSDKRoot)\..\..\UAP\v0.8.0.0\ExtensionSDKs\NativeMathSDK\1.0\</NativeMathSDKPath>
        <IncludePath>$(NativeMathSDKPath)DesignTime\CommonConfiguration\Neutral\Include;$(IncludePath)</IncludePath>
        <LibraryPath>$(NativeMathSDKPath)DesignTime\Debug\x86;$(LibraryPath)</LibraryPath>
      </PropertyGroup>
      <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
         <Link>
           <AdditionalDependencies>NativeMath.lib;%(AdditionalDependencies)</AdditionalDependencies>
         </Link>
      </ItemDefinitionGroup>
    </Project>
    
  12. Wählen Sie auf der Menüleiste ">Andere Windows-Eigenschaften>anzeigen" aus (Tastatur: F4-TASTE auswählen).

  13. Wählen Sie in Projektmappen-Explorer die Datei "NativeMathWRT.winmd" aus. Ändern Sie im Fenster "Eigenschaften " die Eigenschaft "Buildaktion " in "Inhalt", und ändern Sie dann die Eigenschaft "In VSIX einschließen" in "True".

    Wiederholen Sie diesen Vorgang für die Datei "NativeMath.h ".

    Wiederholen Sie diesen Vorgang für die Datei "NativeMathWRT.pri ".

    Wiederholen Sie diesen Vorgang für die Datei "NativeMath.Lib ".

    Wiederholen Sie diesen Vorgang für die Datei "NativeMathSDK.props ".

  14. Wählen Sie in Projektmappen-Explorer die Datei "NativeMath.h" aus. Ändern Sie im Fenster "Eigenschaften " die Eigenschaft "In VSIX einschließen" in "True".

    Wiederholen Sie diesen Vorgang für die Datei "NativeMath.dll ".

    Wiederholen Sie diesen Vorgang für die Datei "NativeMathWRT.dll ".

    Wiederholen Sie diesen Vorgang für die DATEI SDKManifest.xml .

  15. Wählen Sie auf der Menüleiste Erstellen>Projektmappe erstellen aus.

  16. Öffnen Sie in Projektmappen-Explorer das Kontextmenü für das NativeMathVSIX-Projekt, und wählen Sie dann "Ordner öffnen" in Explorer aus.

  17. Navigieren Sie in Explorer zum Ordner $SolutionRoot$\NativeMathVSIX\bin\Debug, und führen Sie dann NativeMathVSIX.vsix aus, um die Installation zu starten.

  18. Klicken Sie auf die Schaltfläche "Installieren ", warten Sie, bis die Installation abgeschlossen ist, und öffnen Sie dann Visual Studio.

So erstellen Sie eine Beispiel-App, die die Klassenbibliothek verwendet

  1. Klicken Sie in der Menüleiste auf Datei>Neu>Projekt.

  2. Erweitern Sie in der Liste der Vorlagen Visual C++>Windows Universal, und wählen Sie dann "Leere App" aus. Geben Sie im Feld "Name " " NativeMathSDKSample" an, und klicken Sie dann auf die Schaltfläche "OK ".

  3. Öffnen Sie in Projektmappen-Explorer das Kontextmenü für das NativeMathSDKSample-Projekt, und wählen Sie dann "Verweis hinzufügen">aus.

  4. Erweitern Sie im Dialogfeld "Verweis hinzufügen" in der Liste der Verweistypen "Universelle Windows", und wählen Sie dann "Erweiterungen" aus. Aktivieren Sie schließlich das Kontrollkästchen Native Math SDK , und klicken Sie dann auf die Schaltfläche "OK ".

  5. Zeigt die Projekteigenschaften für NativeMathSDKSample an.

    Die eigenschaften, die Sie in NativeMathSDK.props definiert haben, wurden angewendet, wenn Sie den Verweis hinzugefügt haben. Sie können überprüfen, ob die Eigenschaften angewendet wurden, indem Sie die VC++-Verzeichnisse-Eigenschaft der Konfigurationseigenschaften des Projekts untersuchen.

  6. Öffnen Sie in Projektmappen-Explorer MainPage.xaml, und verwenden Sie dann den folgenden XAML-Code, um den Inhalt zu ersetzen:

    <Page
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:NativeMathSDKSample"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        x:Class="NativeMathSDKSample.MainPage"
        IsTabStop="false"
        mc:Ignorable="d">
    
        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <TextBox x:Name="FirstNumber" HorizontalAlignment="Left" Margin="327,123,0,0" TextWrapping="Wrap" Text="1" VerticalAlignment="Top" Height="84" Width="259" FontSize="48"/>
            <TextBox x:Name="SecondNumber" HorizontalAlignment="Left" Margin="687,123,0,0" TextWrapping="Wrap" Text="1" VerticalAlignment="Top" Height="84" Width="271" FontSize="48"/>
            <Button x:Name="Execute" Content="=" HorizontalAlignment="Left" Margin="478,387,0,0" VerticalAlignment="Top" Height="63" Width="332" Click="Execute_Click"/>
            <RadioButton Name="add" Content="Add" HorizontalAlignment="Left" Margin="273,262,0,0" VerticalAlignment="Top" GroupName="Operation" IsChecked="True"/>
            <RadioButton Name="subtract" Content="Subtract" HorizontalAlignment="Left" Margin="453,262,0,0" VerticalAlignment="Top" GroupName="Operation" IsChecked="False"/>
            <RadioButton Name="multiplyWRT" Content="Multiply(WRT)" HorizontalAlignment="Left" Margin="615,262,0,0" VerticalAlignment="Top" GroupName="Operation" IsChecked="False"/>
            <RadioButton Name="divideWRT" Content="Divide(WRT)" HorizontalAlignment="Left" Margin="891,262,0,0" VerticalAlignment="Top" GroupName="Operation" IsChecked="False"/>
            <TextBlock Name="resultText" HorizontalAlignment="Left" Margin="478,525,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="332" Height="70" FontSize="48"/>
        </Grid>
    </Page>
    
  7. Aktualisieren Sie "Mainpage.xaml.h" , um diesem Code zu entsprechen:

    //
    // MainPage.xaml.h
    // Declaration of the MainPage class.
    //
    
    #pragma once
    
    #include "MainPage.g.h"
    
    namespace NativeMathSDKSample
    {
        /// <summary>
        /// An empty page that can be used on its own or navigated to within a Frame.
        /// </summary>
        public ref class MainPage sealed
        {
        public:
            MainPage();
    
        protected:
            virtual void OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs^ e) override;
            virtual void Execute_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
        };
    }
    
  8. Aktualisieren Sie "MainPage.xaml.cpp " auf diesen Code:

    //
    // MainPage.xaml.cpp
    // Implementation of the MainPage class.
    //
    
    #include "pch.h"
    #include "MainPage.xaml.h"
    
    #include <sstream>
    
    #include "NativeMath.h"
    
    using namespace NativeMathSDKSample;
    
    using namespace Platform;
    using namespace Windows::Foundation;
    using namespace Windows::Foundation::Collections;
    using namespace Windows::UI::Xaml;
    using namespace Windows::UI::Xaml::Controls;
    using namespace Windows::UI::Xaml::Controls::Primitives;
    using namespace Windows::UI::Xaml::Data;
    using namespace Windows::UI::Xaml::Input;
    using namespace Windows::UI::Xaml::Media;
    using namespace Windows::UI::Xaml::Navigation;
    
    using namespace NativeMathWRT;
    
    // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
    
    MainPage::MainPage()
    {
        InitializeComponent();
    }
    
    /// <summary>
    /// Invoked when this page is about to be displayed in a Frame.
    /// </summary>
    /// <param name="e">Event data that describes how this page was reached.  The Parameter
    /// property is typically used to configure the page.</param>
    void MainPage::OnNavigatedTo(NavigationEventArgs^ e)
    {
    }
    
    void NativeMathSDKSample::MainPage::Execute_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
    {
        double iFirstNumber = _wtof(FirstNumber->Text->Data());
        double iSecondNumber = _wtof(SecondNumber->Text->Data());
        double result = 0;
    
        BasicMathWinMD^ basicMathWinMD = ref new BasicMathWinMD();
        BasicMath basicMath;
    
        if(add->IsChecked->Value == true)
        {
            result = basicMath.add(iFirstNumber, iSecondNumber);
        }
        else if(subtract->IsChecked->Value == true)
        {
            result = basicMath.subtract(iFirstNumber, iSecondNumber);
        }
        else if(multiplyWRT->IsChecked->Value == true)
        {
            result = basicMathWinMD->multiply(iFirstNumber, iSecondNumber);
        }
        else if (divideWRT->IsChecked->Value == true)
        {
            result = basicMathWinMD->divide(iFirstNumber, iSecondNumber);
        }
    
        std::wstringstream s;
        s << result;
    
        resultText->Text = ref new String(s.str().c_str());
    
    }
    
  9. Wählen Sie die F5-TASTE aus, um die App auszuführen.

  10. Geben Sie in der App beliebige zwei Zahlen ein, wählen Sie einen Vorgang aus, und wählen Sie dann die = Schaltfläche aus.

    Das richtige Ergebnis wird angezeigt.

    In dieser exemplarischen Vorgehensweise wurde gezeigt, wie Sie ein Erweiterungs-SDK erstellen und verwenden, um eine Windows-Runtime-Bibliothek und eine Nicht-Windows-Runtime-Bibliothek aufzurufen.