共用方式為


逐步解說:使用 C++ 建立 SDK

本逐步解說示範如何建立原生 C++ 數學程式庫 SDK、將 SDK 封裝為 Visual Studio 擴充功能 (VSIX),然後使用它來建立應用程式。 逐步解說分成下列步驟:

必要條件

若要依照本逐步解說執行作業,您必須安裝 Visual Studio SDK。 如需詳細資訊,請參閱 Visual Studio SDK

建立原生和 Windows 執行階段程式庫

  1. 在功能表列上,選擇 [檔案]>[新增]>[專案]

  2. 在範本清單中,展開 Visual C++>Windows 通用,然後選取 DLL (Windows 通用應用程式) 範本。 在名稱方塊中,指定 NativeMath,然後選擇確定按鈕。

  3. 更新 NativeMath.h 以符合下列程式碼。

    #pragma once
    
    class __declspec(dllexport) BasicMath 
    {
    public:
        BasicMath();
        double add(double firstNumber, double secondNumber);
        double subtract(double firstNumber, double secondNumber);
    };
    
  4. 更新 NativeMath.cpp 以符合下列程式碼:

    // 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. 方案總管中,開啟方案 [NativeMath] 的捷徑功能表,然後選擇新增>新增專案

  6. 在範本清單中,展開 Visual C++,然後選取 Windows 執行階段元件範本。 在名稱方塊中,指定 NativeMathWRT,然後選擇確定按鈕。

  7. 更新 Class1.h 以符合下列程式碼:

    #pragma once
    
    namespace NativeMathWRT
    {
        public ref class BasicMathWinMD sealed
        {
        public:
            BasicMathWinMD(){};
            double multiply(double firstNumber, double secondNumber);
            double divide(double firstNumber, double secondNumber);
        };
    }
    
  8. 更新 Class1.cpp 以符合下列程式碼:

    // 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. 在功能表列上選擇 [建置]>[建置解決方案]

建立 NativeMathVSIX 擴充功能專案

  1. 方案總管中,開啟方案 [NativeMath] 的捷徑功能表,然後選擇新增>新增專案

  2. 在範本清單中,展開 Visual C#>擴充性,然後選取 VSIX 專案。 在名稱方塊中,指定 NativeMathVSIX,然後選擇確定按鈕。

  3. 方案總管中,開啟 source.extension.vsixmanifest 的捷徑功能表,然後選擇檢視程式碼

  4. 使用下列 XML 取代現有的 XML。

    <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. 方案總管中,開啟 NativeMathVSIX 專案的捷徑功能表,然後選擇新增>新增項目

  6. Visual C# 項目清單中,展開資料,然後選取 XML 檔案。 在名稱方塊中,指定 SDKManifest.xml,然後選擇確定按鈕。

  7. 使用此 XML 取代檔案的內容:

    <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. 方案總管中,NativeMathVSIX 專案下,建立此資料夾結構:

    \DesignTime
          \CommonConfiguration
                \Neutral
                      \Include
          \Debug
                \x86
    \Redist
          \Debug
                \x86
    \References
          \CommonConfiguration
                \Neutral
    
  9. 方案總管中,開啟解決方案 [NativeMath] 的捷徑功能表,然後選擇在檔案總管中開啟資料夾

  10. 檔案總管中,複製 $SolutionRoot$\NativeMath\NativeMath.h,然後在方案總管NativeMathVSIX 專案中,將其貼到 $SolutionRoot$\NativeMathVSIX\DesignTime\CommonConfiguration\Neutral\Include\ 資料夾中。

    複製 $SolutionRoot$\Debug\NativeMath\NativeMath.lib,然後將其貼到 $SolutionRoot$\NativeMathVSIX\DesignTime\Debug\x86\ 資料夾中。

    複製 $SolutionRoot$\Debug\NativeMath\NativeMath.dll,然後將其貼到 $SolutionRoot$\NativeMathVSIX\Redist\Debug\x86\ 資料夾中。

    複製 $SolutionRoot$\Debug\NativeMathWRT\NativeMathWRT.dll,然後將其貼到 $SolutionRoot$\NativeMathVSIX\Redist\Debug\x86\ 資料夾中。 複製 $SolutionRoot$\Debug\NativeMathWRT\NativeMathWRT.winmd,然後將其貼到 $SolutionRoot$\NativeMathVSIX\References\CommonConfiguration\Neutral 資料夾中。

    複製 $SolutionRoot$\Debug\NativeMathWRT\NativeMathWRT.pri,然後將其貼到 $SolutionRoot$\NativeMathVSIX\References\CommonConfiguration\Neutral 資料夾中。

  11. $SolutionRoot$\NativeMathVSIX\DesignTime\Debug\x86\ 資料夾中,建立名為 NativeMathSDK.props 的文字檔,然後將下列內容貼到其中:

    <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. 在功能表列上,選擇視窗>其他視窗>屬性視窗 (鍵盤:選擇 F4 鍵)。

  13. 方案總管中,選取 NativeMathWRT.winmd 檔案。 在屬性視窗中,將建置動作屬性變更為內容,然後將包含在 VSIX 屬性變更為 True

    針對 NativeMath.h 檔案重複此程序。

    針對 NativeMathWRT.pri 檔案重複此程序。

    針對 NativeMath.Lib 檔案重複此程序。

    針對 NativeMathSDK.props 檔案重複此程序。

  14. 方案總管中,選取 NativeMath.h 檔案。 在屬性視窗中,將包含在 VSIX 屬性變更為 True

    針對 NativeMath.dll 檔案重複此程序。

    針對 NativeMathWRT.dll 檔案重複此程序。

    針對 SDKManifest.xml 檔案重複此程序。

  15. 在功能表列上選擇 [建置]>[建置解決方案]

  16. 方案總管中,開啟 NativeMathVSIX 專案的捷徑功能表,然後選擇在檔案總管中開啟資料夾

  17. 檔案總管中,瀏覽至 $SolutionRoot$\NativeMathVSIX\bin\Debug 資料夾,然後執行 NativeMathVSIX.vsix 開始安裝。

  18. 選擇安裝按鈕,等待安裝完成,然後開啟 Visual Studio。

建立使用類別庫的範例應用程式

  1. 在功能表列上,選擇 [檔案]>[新增]>[專案]

  2. 在範本清單中,展開 Visual C++>Windows 通用,然後選取空白應用程式。 在名稱方塊中,指定 NativeMathSDKSample,然後選擇確定按鈕。

  3. 方案總管中,開啟 NativeMathSDKSample 專案的捷徑功能表,然後選擇新增>參考

  4. 新增參考對話框的參考類型清單中,展開通用 Windows,然後選取擴充功能。 最後,選取原生數學 SDK 核取方塊 ,然後選擇確定按鈕。

  5. 顯示 NativeMathSDKSample 的專案屬性。

    當您新增參考時,會套用您在 NativeMathSDK.props 中定義的屬性。 您可以檢查專案的組態屬性VC++ 目錄屬性,以確認屬性已套用。

  6. 方案總管中,開啟 MainPage.xaml,然後使用下列 XAML 來取代其內容:

    <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. 更新 Mainpage.xaml.h 以符合下列程式碼:

    //
    // 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. 更新 MainPage.xaml.cpp 以符合下列程式碼:

    //
    // 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. 選擇 F5 鍵以執行應用程式。

  10. 在應用程式中,輸入任兩個數字、選取作業,然後選擇 = 按鈕。

    顯示正確結果。

    本逐步解說示範如何建立及使用 [擴充功能 SDK] 來呼叫 Windows 執行階段程式庫和非 Windows 執行階段程式庫。