Procédure pas à pas : Créer un KIT DE développement logiciel (SDK) à l’aide de C++

Cette procédure pas à pas montre comment créer un kit SDK de bibliothèque mathématique C++ natif, empaqueter le Kit de développement logiciel (SDK) en tant qu’extension Visual Studio (VSIX), puis l’utiliser pour créer une application. La procédure pas à pas est divisée en étapes suivantes :

Prérequis

Pour suivre cette procédure pas à pas, vous devez installer le Kit de développement logiciel (SDK) Visual Studio. Pour plus d'informations, consultez SDK Visual Studio.

Pour créer les bibliothèques natives et Windows Runtime

  1. Dans la barre de menus, choisissez Fichier>Nouveau>Projet.

  2. Dans la liste des modèles, développez Visual C++>Windows Universal, puis sélectionnez le modèle DLL (applications windows universelles). Dans la zone Nom , spécifiez NativeMath, puis choisissez le bouton OK .

  3. Mettez à jour NativeMath.h pour qu’il corresponde au code suivant.

    #pragma once
    
    class __declspec(dllexport) BasicMath 
    {
    public:
        BasicMath();
        double add(double firstNumber, double secondNumber);
        double subtract(double firstNumber, double secondNumber);
    };
    
  4. Mettez à jour NativeMath.cpp pour qu’il corresponde à ce code :

    // 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. Dans Explorateur de solutions, ouvrez le menu contextuel de la solution « NativeMath », puis choisissez Ajouter>un nouveau projet.

  6. Dans la liste des modèles, développez Visual C++, puis sélectionnez le modèle de composant Windows Runtime. Dans la zone Nom , spécifiez NativeMathWRT, puis choisissez le bouton OK .

  7. Mettez à jour Class1.h pour qu’il corresponde à ce code :

    #pragma once
    
    namespace NativeMathWRT
    {
        public ref class BasicMathWinMD sealed
        {
        public:
            BasicMathWinMD(){};
            double multiply(double firstNumber, double secondNumber);
            double divide(double firstNumber, double secondNumber);
        };
    }
    
  8. Mettez à jour Class1.cpp pour qu’il corresponde à ce code :

    // 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. Dans la barre de menus, choisissez Générer>Générer la solution.

Pour créer le projet d’extension NativeMathVSIX

  1. Dans Explorateur de solutions, ouvrez le menu contextuel de la solution « NativeMath », puis choisissez Ajouter>un nouveau projet.

  2. Dans la liste des modèles, développez Visual C#>Extensibilité, puis sélectionnez Projet VSIX. Dans la zone Nom , spécifiez NativeMathVSIX, puis choisissez le bouton OK .

  3. Dans Explorateur de solutions, ouvrez le menu contextuel de source.extension.vsixmanifest, puis choisissez Afficher le code.

  4. Utilisez le code XML suivant pour remplacer le code XML existant.

    <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. Dans Explorateur de solutions, ouvrez le menu contextuel du projet NativeMathVSIX, puis choisissez Ajouter>un nouvel élément.

  6. Dans la liste des éléments Visual C#, développez Données, puis sélectionnez Fichier XML. Dans la zone Nom , spécifiez SDKManifest.xml, puis choisissez le bouton OK .

  7. Utilisez ce code XML pour remplacer le contenu du fichier :

    <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. Dans Explorateur de solutions, sous le projet NativeMathVSIX, créez cette structure de dossiers :

    \DesignTime
          \CommonConfiguration
                \Neutral
                      \Include
          \Debug
                \x86
    \Redist
          \Debug
                \x86
    \References
          \CommonConfiguration
                \Neutral
    
  9. Dans Explorateur de solutions, ouvrez le menu contextuel de la solution « NativeMath », puis choisissez Ouvrir le dossier dans Explorateur de fichiers.

  10. Dans Explorateur de fichiers, copiez $SolutionRoot$\NativeMath\NativeMath.h, puis, dans Explorateur de solutions, sous le projet NativeMathVSIX, collez-le dans le dossier $SolutionRoot$\NativeMathVSIX\DesignTime\CommonConfiguration\Neutral\Include\.

    Copiez $SolutionRoot$\Debug\NativeMath\NativeMath.lib, puis collez-la dans le dossier $SolutionRoot$\NativeMathVSIX\DesignTime\Debug\x86\ .

    Copiez $SolutionRoot$\Debug\NativeMath\NativeMath.dll et collez-la dans le dossier $SolutionRoot$\NativeMathVSIX\Redist\Debug\x86\ .

    Copiez $SolutionRoot$\Debug\NativeMathWRT\NativeMathWRT.dll et collez-la dans le dossier $SolutionRoot$\NativeMathVSIX\Redist\Debug\x86 . Copiez $SolutionRoot$\Debug\NativeMathWRT\NativeMathWRT.winmd et collez-le dans le dossier $SolutionRoot$\NativeMathVSIX\References\CommonConfiguration\Neutral .

    Copiez $SolutionRoot$\Debug\NativeMathWRT\NativeMathWRT.pri et collez-le dans le dossier $SolutionRoot$\NativeMathVSIX\References\CommonConfiguration\Neutral .

  11. Dans le dossier $SolutionRoot$\NativeMathVSIX\DesignTime\Debug\x86\ , créez un fichier texte nommé NativeMathSDK.props, puis collez le contenu suivant :

    <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. Dans la barre de menus, choisissez Afficher>d’autres fenêtres propriétés Windows>(Clavier : choisissez la touche F4).

  13. Dans Explorateur de solutions, sélectionnez le fichier NativeMathWRT.winmd. Dans la fenêtre Propriétés, remplacez la propriété Action de génération par Contenu, puis définissez la propriété Include dans VSIX sur True.

    Répétez ce processus pour le fichier NativeMath.h .

    Répétez ce processus pour le fichier NativeMathWRT.pri .

    Répétez ce processus pour le fichier NativeMath.Lib .

    Répétez ce processus pour le fichier NativeMathSDK.props .

  14. Dans Explorateur de solutions, sélectionnez le fichier NativeMath.h. Dans la fenêtre Propriétés, remplacez la propriété Include dans VSIX par True.

    Répétez ce processus pour le fichier NativeMath.dll .

    Répétez ce processus pour le fichier NativeMathWRT.dll .

    Répétez ce processus pour le fichier SDKManifest.xml .

  15. Dans la barre de menus, choisissez Générer>Générer la solution.

  16. Dans Explorateur de solutions, ouvrez le menu contextuel du projet NativeMathVSIX, puis choisissez Ouvrir le dossier dans Explorateur de fichiers.

  17. Dans Explorateur de fichiers, accédez au dossier $SolutionRoot$\NativeMathVSIX\bin\Debug, puis exécutez NativeMathVSIX.vsix pour commencer l’installation.

  18. Choisissez le bouton Installer , attendez la fin de l’installation, puis ouvrez Visual Studio.

Pour créer un exemple d’application qui utilise la bibliothèque de classes

  1. Dans la barre de menus, choisissez Fichier>Nouveau>Projet.

  2. Dans la liste des modèles, développez Visual C++>Windows Universel, puis sélectionnez Application vide. Dans la zone Nom , spécifiez NativeMathSDKSample, puis choisissez le bouton OK .

  3. Dans Explorateur de solutions, ouvrez le menu contextuel du projet NativeMathSDKSample, puis choisissez Ajouter>une référence.

  4. Dans la boîte de dialogue Ajouter une référence , dans la liste des types de référence, développez Windows universel, puis sélectionnez Extensions. Enfin, sélectionnez la zone case activée sdk Mathématiques natives, puis cliquez sur le bouton OK.

  5. Affichez les propriétés du projet pour NativeMathSDKSample.

    Les propriétés que vous avez définies dans NativeMathSDK.props ont été appliquées lorsque vous avez ajouté la référence. Vous pouvez vérifier que les propriétés ont été appliquées en examinant la propriété Répertoires VC++ des propriétés de configuration du projet.

  6. Dans Explorateur de solutions, ouvrez MainPage.xaml, puis utilisez le code XAML suivant pour remplacer son contenu :

    <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. Mettez à jour Mainpage.xaml.h pour qu’il corresponde à ce code :

    //
    // 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. Mettez à jour MainPage.xaml.cpp pour qu’il corresponde à ce 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. Choisissez la touche F5 pour exécuter l’application.

  10. Dans l’application, entrez deux nombres, sélectionnez une opération, puis choisissez le = bouton.

    Le résultat correct s’affiche.

    Cette procédure pas à pas a montré comment créer et utiliser un Kit de développement logiciel (SDK) d’extension pour appeler une bibliothèque Windows Runtime et une bibliothèque non-Windows Runtime.