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
En la barra de menús, elija Archivo>Nuevo>Proyecto.
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
NativeMath
y, a continuación, elija el botón Aceptar .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); };
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; }
En Explorador de soluciones, abra el menú contextual de la solución "NativeMath" y, a continuación, elija Agregar>nuevo proyecto.
En la lista de plantillas, expanda Visual C++y, a continuación, seleccione la plantilla Componente de Windows Runtime. En el cuadro Nombre , especifique
NativeMathWRT
y, a continuación, elija el botón Aceptar .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); }; }
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; }
En la barra de menús, elija Compilar>Compilar solución.
Para crear el proyecto de extensión NativeMathVSIX
En Explorador de soluciones, abra el menú contextual de la solución "NativeMath" y, a continuación, elija Agregar>nuevo proyecto.
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 .
En Explorador de soluciones, abra el menú contextual de source.extension.vsixmanifest y elija Ver código.
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>
En Explorador de soluciones, abra el menú contextual del proyecto NativeMathVSIX y, a continuación, elija Agregar>nuevo elemento.
En la lista de elementos de Visual C#, expanda Datos y, a continuación, seleccione Archivo XML. En el cuadro Nombre , especifique
SDKManifest.xml
y, a continuación, elija el botón Aceptar .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>
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
En Explorador de soluciones, abra el menú contextual de la solución "NativeMath" y, a continuación, elija Abrir carpeta en Explorador de archivos.
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 .
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>
En la barra de menús, elija Ver>otras>ventanas propiedades (Teclado: Elija la tecla F4).
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 .
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 .
En la barra de menús, elija Compilar>Compilar solución.
En Explorador de soluciones, abra el menú contextual del proyecto NativeMathVSIX y, a continuación, elija Abrir carpeta en Explorador de archivos.
En Explorador de archivos, vaya a la carpeta $SolutionRoot$\NativeMathVSIX\bin\Debug y, a continuación, ejecute NativeMathVSIX.vsix para iniciar la instalación.
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
En la barra de menús, elija Archivo>Nuevo>Proyecto.
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 .
En Explorador de soluciones, abra el menú contextual del proyecto NativeMathSDKSample y, a continuación, elija Agregar>referencia.
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 .
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.
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>
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); }; }
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()); }
Elija la tecla F5 para ejecutar la aplicación.
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.