Compartir a través de


Tutorial: Creación de un SDK con C++

En este tutorial se muestra cómo crear un SDK nativo de biblioteca matemática de C++, empaquetar el SDK como una extensión de Visual Studio (VSIX) y usarlo para crear una aplicación. El tutorial se divide en estos pasos:

Requisitos previos

Para seguir este tutorial, debe instalar SDK de Visual Studio. Para obtener más información, vea SDK de Visual Studio.

Para crear las bibliotecas nativas y de Windows Runtime

  1. En la barra de menús, elija Archivo>Nuevo>Proyecto.

  2. En la lista de plantillas, expanda Visual C++>Windows Universal y, a continuación, seleccione la plantilla DLL (aplicaciones universales de Windows). En el cuadro Nombre , especifique NativeMathy, a continuación, elija el botón Aceptar .

  3. Actualice NativeMath.h para que coincida con el código siguiente.

    #pragma once
    
    class __declspec(dllexport) BasicMath 
    {
    public:
        BasicMath();
        double add(double firstNumber, double secondNumber);
        double subtract(double firstNumber, double secondNumber);
    };
    
  4. Actualice NativeMath.cpp para que coincida con este código:

    // 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. En Explorador de soluciones, abra el menú contextual de la solución "NativeMath" y, a continuación, elija Agregar>nuevo proyecto.

  6. En la lista de plantillas, expanda Visual C++y, a continuación, seleccione la plantilla Componente de Windows Runtime. En el cuadro Nombre , especifique NativeMathWRTy, a continuación, elija el botón Aceptar .

  7. Actualice Class1.h para que coincida con este código:

    #pragma once
    
    namespace NativeMathWRT
    {
        public ref class BasicMathWinMD sealed
        {
        public:
            BasicMathWinMD(){};
            double multiply(double firstNumber, double secondNumber);
            double divide(double firstNumber, double secondNumber);
        };
    }
    
  8. Actualice Class1.cpp para que coincida con este código:

    // 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. En la barra de menús, elija Compilar>Compilar solución.

Para crear el proyecto de extensión NativeMathVSIX

  1. En Explorador de soluciones, abra el menú contextual de la solución "NativeMath" y, a continuación, elija Agregar>nuevo proyecto.

  2. En la lista de plantillas, expanda Extensibilidad de Visual C#>y, a continuación, seleccione Proyecto VSIX. En el cuadro Nombre , especifique NativeMathVSIX y, a continuación, elija el botón Aceptar .

  3. En Explorador de soluciones, abra el menú contextual de source.extension.vsixmanifest y elija Ver código.

  4. Use el siguiente XML para reemplazar el XML existente.

    <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. En Explorador de soluciones, abra el menú contextual del proyecto NativeMathVSIX y, a continuación, elija Agregar>nuevo elemento.

  6. En la lista de elementos de Visual C#, expanda Datos y, a continuación, seleccione Archivo XML. En el cuadro Nombre , especifique SDKManifest.xmly, a continuación, elija el botón Aceptar .

  7. Use este XML para reemplazar el contenido del archivo:

    <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. En Explorador de soluciones, en el proyecto NativeMathVSIX, cree esta estructura de carpetas:

    \DesignTime
          \CommonConfiguration
                \Neutral
                      \Include
          \Debug
                \x86
    \Redist
          \Debug
                \x86
    \References
          \CommonConfiguration
                \Neutral
    
  9. En Explorador de soluciones, abra el menú contextual de la solución "NativeMath" y, a continuación, elija Abrir carpeta en Explorador de archivos.

  10. En Explorador de archivos, copie $SolutionRoot$\NativeMath\NativeMath.h y, a continuación, en Explorador de soluciones, en el proyecto NativeMathVSIX, péguelo en la carpeta $SolutionRoot$\NativeMathVSIX\DesignTime\CommonConfiguration\Neutral\Include\.

    Copie $SolutionRoot$\Debug\NativeMath\NativeMath.lib y péguelo en la carpeta $SolutionRoot$\NativeMathVSIX\DesignTime\Debug\x86\ .

    Copie $SolutionRoot$\Debug\NativeMath\NativeMath.dll y péguelo en la carpeta $SolutionRoot$\NativeMathVSIX\Redist\Debug\x86\ .

    Copie $SolutionRoot$\Debug\NativeMathWRT\NativeMathWRT.dll y péguelo en la carpeta $SolutionRoot$\NativeMathVSIX\Redist\Debug\x86 . Copie $SolutionRoot$\Debug\NativeMathWRT\NativeMathWRT.winmd y péguelo en la carpeta $SolutionRoot$\NativeMathVSIX\References\CommonConfiguration\Neutral .

    Copie $SolutionRoot$\Debug\NativeMathWRT\NativeMathWRT.pri y péguelo en la carpeta $SolutionRoot$\NativeMathVSIX\References\CommonConfiguration\Neutral .

  11. En la carpeta $SolutionRoot$\NativeMathVSIX\DesignTime\Debug\x86\ , cree un archivo de texto denominado NativeMathSDK.props y pegue el siguiente contenido en él:

    <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. En la barra de menús, elija Ver>otras>ventanas propiedades (Teclado: Elija la tecla F4).

  13. En Explorador de soluciones, seleccione el archivo NativeMathWRT.winmd. En la ventana Propiedades , cambie la propiedad Acción de compilación a Contenido y, a continuación, cambie la propiedad Include in VSIX a True.

    Repita este proceso para el archivo NativeMath.h .

    Repita este proceso para el archivo NativeMathWRT.pri .

    Repita este proceso para el archivo NativeMath.Lib .

    Repita este proceso para el archivo NativeMathSDK.props .

  14. En Explorador de soluciones, seleccione el archivo NativeMath.h. En la ventana Propiedades , cambie la propiedad Include in VSIX a True.

    Repita este proceso para el archivo NativeMath.dll .

    Repita este proceso para el archivo NativeMathWRT.dll .

    Repita este proceso para el archivo SDKManifest.xml .

  15. En la barra de menús, elija Compilar>Compilar solución.

  16. En Explorador de soluciones, abra el menú contextual del proyecto NativeMathVSIX y, a continuación, elija Abrir carpeta en Explorador de archivos.

  17. En Explorador de archivos, vaya a la carpeta $SolutionRoot$\NativeMathVSIX\bin\Debug y, a continuación, ejecute NativeMathVSIX.vsix para iniciar la instalación.

  18. Elija el botón Instalar , espere a que finalice la instalación y abra Visual Studio.

Para crear una aplicación de ejemplo que use la biblioteca de clases

  1. En la barra de menús, elija Archivo>Nuevo>Proyecto.

  2. En la lista de plantillas, expanda Visual C++>Windows Universal y, a continuación, seleccione Aplicación en blanco. En el cuadro Nombre , especifique NativeMathSDKSample y, a continuación, elija el botón Aceptar .

  3. En Explorador de soluciones, abra el menú contextual del proyecto NativeMathSDKSample y, a continuación, elija Agregar>referencia.

  4. En el cuadro de diálogo Agregar referencia , en la lista de tipos de referencia, expanda Windows universal y, a continuación, seleccione Extensiones. Por último, active la casilla SDK de Matemáticas nativas y, a continuación, elija el botón Aceptar .

  5. Muestra las propiedades del proyecto para NativeMathSDKSample.

    Las propiedades que definió en NativeMathSDK.props se aplicaron al agregar la referencia. Puede comprobar que las propiedades se aplicaron examinando la propiedad Directorios de VC++ de las propiedades de configuración del proyecto.

  6. En Explorador de soluciones, abra MainPage.xaml y, a continuación, use el código XAML siguiente para reemplazar su contenido:

    <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. Actualice Mainpage.xaml.h para que coincida con este código:

    //
    // 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. Actualice MainPage.xaml.cpp para que coincida con este código:

    //
    // 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. Elija la tecla F5 para ejecutar la aplicación.

  10. En la aplicación, escriba dos números, seleccione una operación y, a continuación, elija el = botón .

    Aparece el resultado correcto.

    En este tutorial se muestra cómo crear y usar un SDK de extensión para llamar a una biblioteca de Windows Runtime y una biblioteca que no sea de Windows Runtime.