Procedura dettagliata: Creare un SDK con C++
Questa procedura dettagliata illustra come creare un SDK della libreria matematica C++ nativa, creare un pacchetto dell'SDK come estensione di Visual Studio (VSIX) e quindi usarlo per creare un'app. La procedura dettagliata è suddivisa in questi passaggi:
Prerequisiti
Per seguire questa procedura dettagliata, è necessario installare Visual Studio SDK. Per altre informazioni, vedere Visual Studio SDK.
Per creare le librerie native e Windows Runtime
Nella barra dei menu scegliere File>Nuovo>Progetto.
Nell'elenco dei modelli espandere Visual C++>Windows Universale e quindi selezionare il modello DLL (app universali di Windows). Nella casella Nome specificare
NativeMath
e quindi scegliere il pulsante OK.Aggiornare NativeMath.h in modo che corrisponda al codice seguente.
#pragma once class __declspec(dllexport) BasicMath { public: BasicMath(); double add(double firstNumber, double secondNumber); double subtract(double firstNumber, double secondNumber); };
Aggiornare NativeMath.cpp in modo che corrisponda al codice seguente:
// 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; }
In Esplora soluzioni aprire il menu di scelta rapida per Soluzione 'NativeMath', quindi scegliere Aggiungi>nuovo progetto.
Nell'elenco dei modelli espandere Visual C++, quindi selezionare il modello Componente Windows Runtime. Nella casella Nome specificare
NativeMathWRT
e quindi scegliere il pulsante OK.Aggiornare Class1.h in modo che corrisponda al codice seguente:
#pragma once namespace NativeMathWRT { public ref class BasicMathWinMD sealed { public: BasicMathWinMD(){}; double multiply(double firstNumber, double secondNumber); double divide(double firstNumber, double secondNumber); }; }
Aggiornare Class1.cpp in modo che corrisponda al codice seguente:
// 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; }
Nella barra dei menu scegliere Compila>Compila soluzione.
Per creare il progetto di estensione NativeMathVSIX
In Esplora soluzioni aprire il menu di scelta rapida per Soluzione 'NativeMath', quindi scegliere Aggiungi>nuovo progetto.
Nell'elenco dei modelli espandere Visual C#>Extensibility e quindi selezionare Progetto VSIX. Nella casella Nome specificare NativeMathVSIX e quindi scegliere il pulsante OK .
In Esplora soluzioni aprire il menu di scelta rapida per source.extension.vsixmanifest e quindi scegliere Visualizza codice.
Utilizzare il codice XML seguente per sostituire il codice XML esistente.
<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>
In Esplora soluzioni aprire il menu di scelta rapida per il progetto NativeMathVSIX e quindi scegliere Aggiungi>nuovo elemento.
Nell'elenco di elementi di Visual C# espandere Dati e quindi selezionare File XML. Nella casella Nome specificare
SDKManifest.xml
e quindi scegliere il pulsante OK.Utilizzare questo codice XML per sostituire il contenuto del file:
<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>
In Esplora soluzioni, nel progetto NativeMathVSIX creare questa struttura di cartelle:
\DesignTime \CommonConfiguration \Neutral \Include \Debug \x86 \Redist \Debug \x86 \References \CommonConfiguration \Neutral
In Esplora soluzioni aprire il menu di scelta rapida per Soluzione 'NativeMath', quindi scegliere Apri cartella in Esplora file.
In Esplora file copiare $SolutionRoot$\NativeMath\NativeMath.h e quindi in Esplora soluzioni, nel progetto NativeMathVSIX, incollarlo nella cartella $SolutionRoot$\NativeMathVSIX\DesignTime\CommonConfiguration\Neutral\Include\.
Copiare $SolutionRoot$\Debug\NativeMath\NativeMath.lib e incollarlo nella cartella $SolutionRoot$\NativeMathVSIX\DesignTime\Debug\x86\ .
Copiare $SolutionRoot$\Debug\NativeMath\NativeMath.dll e incollarlo nella cartella $SolutionRoot$\NativeMathVSIX\Redist\Debug\x86\ .
Copiare $SolutionRoot$\Debug\NativeMathWRT\NativeMathWRT.dll e incollarlo nella cartella $SolutionRoot$\NativeMathVSIX\Redist\Debug\x86 . Copiare $SolutionRoot$\Debug\NativeMathWRT\NativeMathWRT.winmd e incollarlo nella cartella $SolutionRoot$\NativeMathVSIX\References\CommonConfiguration\Neutral .
Copiare $SolutionRoot$\Debug\NativeMathWRT\NativeMathWRT.pri e incollarlo nella cartella $SolutionRoot$\NativeMathVSIX\References\CommonConfiguration\Neutral .
Nella cartella $SolutionRoot$\NativeMathVSIX\DesignTime\Debug\x86\ creare un file di testo denominato NativeMathSDK.props e quindi incollarvi il contenuto seguente:
<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>
Sulla barra dei menu scegliere Visualizza>altra finestra Proprietà di Windows>(tastiera: scegliere il tasto F4).
In Esplora soluzioni selezionare il file NativeMathWRT.winmd. Nella finestra Proprietà modificare la proprietà Azione di compilazione in Contenuto e quindi impostare la proprietà Includi in VSIX su True.
Ripetere questo processo per il file NativeMath.h .
Ripetere questo processo per il file NativeMathWRT.pri .
Ripetere questo processo per il file NativeMath.Lib .
Ripetere questo processo per il file NativeMathSDK.props .
In Esplora soluzioni selezionare il file NativeMath.h. Nella finestra Proprietà modificare la proprietà Includi in VSIX impostandola su True.
Ripetere questo processo per il file NativeMath.dll .
Ripetere questo processo per il file NativeMathWRT.dll .
Ripetere questo processo per il file SDKManifest.xml .
Nella barra dei menu scegliere Compila>Compila soluzione.
In Esplora soluzioni aprire il menu di scelta rapida per il progetto NativeMathVSIX e quindi scegliere Apri cartella in Esplora file.
In Esplora file passare alla cartella $SolutionRoot$\NativeMathVSIX\bin\Debug, quindi eseguire NativeMathVSIX.vsix per avviare l'installazione.
Scegliere il pulsante Installa , attendere il completamento dell'installazione e quindi aprire Visual Studio.
Per creare un'app di esempio che usa la libreria di classi
Nella barra dei menu scegliere File>Nuovo>Progetto.
Nell'elenco dei modelli espandere Visual C++>Windows Universale e quindi selezionare App vuota. Nella casella Nome specificare NativeMathSDKSample e quindi scegliere il pulsante OK.
In Esplora soluzioni aprire il menu di scelta rapida per il progetto NativeMathSDKSample e quindi scegliere Aggiungi>riferimento.
Nell'elenco dei tipi di riferimento della finestra di dialogo Aggiungi riferimento espandere Windows universale e quindi selezionare Estensioni. Infine, selezionare la casella di controllo Native Math SDK e quindi scegliere il pulsante OK .
Visualizzare le proprietà del progetto per NativeMathSDKSample.
Le proprietà definite in NativeMathSDK.props sono state applicate quando è stato aggiunto il riferimento. È possibile verificare che le proprietà siano state applicate esaminando la proprietà Directory VC++ delle proprietà di configurazione del progetto.
In Esplora soluzioni aprire MainPage.xaml e quindi usare il codice XAML seguente per sostituire il contenuto:
<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>
Aggiornare Mainpage.xaml.h in modo che corrisponda al codice seguente:
// // 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); }; }
Aggiornare MainPage.xaml.cpp in modo che corrisponda al codice seguente:
// // 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()); }
Scegliere il tasto F5 per eseguire l'app.
Nell'app immettere due numeri, selezionare un'operazione e quindi scegliere il = pulsante.
Viene visualizzato il risultato corretto.
Questa procedura dettagliata ha illustrato come creare e usare un SDK di estensione per chiamare una libreria di Windows Runtime e una libreria non Windows Runtime.