演练:使用 C# 或 Visual Basic 创建 SDK

在本演练中,你将了解如何使用 Visual C# 创建简单的数学库 SDK,然后使用本演练将 SDK 打包为 Visual Studio 扩展 (VSIX)。 你将完成以下过程:

先决条件

要按照本演练的步骤操作,必须安装 Visual Studio SDK。 有关详细信息,请参阅 Visual Studio SDK

创建 SimpleMath Windows 运行时组件

  1. 在菜单栏上,依次选择“文件”>“新建”>“项目”。

  2. 在模板列表中,展开 Visual C#Visual Basic,选择“Microsoft Store”节点,然后选择“Windows 运行时组件”模板。

  3. 在“名称”框中,指定 SimpleMath,然后选择“确定”按钮。

  4. 在“解决方案资源管理器”中,打开 SimpleMath 项目节点的快捷键菜单,然后选择“属性”。

  5. Class1.cs 重命名为 Arithmetic.cs,并将其更新为匹配以下代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace WinRTMath
    {
        public sealed class Arithmetic
        {
            public float add(float firstNumber, float secondNumber)
            {
                return (firstNumber + secondNumber);
            }
    
            public float subtract(float firstNumber, float secondNumber)
            {
                return (firstNumber - secondNumber);
            }
    
            public float multiply(float firstNumber, float secondNumber)
            {
                return (firstNumber * secondNumber);
            }
    
            public float divide(float firstNumber, float secondNumber)
            {
                return (firstNumber / secondNumber);
            }
        }
    }
    
  6. 解决方案资源管理器中,打开“解决方案’SimpleMath’”节点的快捷键菜单,然后选择“配置管理器”。

    此时将打开“配置管理器”对话框。

  7. 在“活动解决方案配置”列表中,选择“发布”。

  8. 在“配置”列中,验证 SimpleMath 行是否设置为“发布”,然后选择关闭按钮接受更改。

    重要

    SimpleMath 组件的 SDK 仅包含一个配置。 此配置必须是发布版本,否则使用该组件的应用不会通过 Microsoft Store 的认证。

  9. 解决方案资源管理器中,打开 SimpleMath 项目节点的快捷键菜单,然后选择“生成”。

创建 SimpleMathVSIX 扩展项目

  1. 在“解决方案’SimpleMath’”节点的快捷键菜单上,选择“添加”>“新项目”。

  2. 在模板列表中,展开 Visual C#Visual Basic,选择“扩展性”节点,然后选择“VSIX 项目”模板。

  3. 在“名称”框中,指定 SimpleMathVSIX,然后选择确定按钮。

  4. 解决方案资源管理器中,选择 source.extension.vsixmanifest 项。

  5. 在菜单栏上,选择“视图”>“代码”

  6. 将现有 XML 替换为以下 XAML:

    <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="SimpleMath" Version="1.0" Language="en-US" Publisher="[YourName]" />
        <DisplayName>SimpleMath Library</DisplayName>
        <Description xml:space="preserve">Basic arithmetic operations in a WinRT-compatible library. Implemented in C#.</Description>
      </Metadata>
      <Installation Scope="Global" AllUsers="true">
        <InstallationTarget Id="Microsoft.ExtensionSDK" TargetPlatformIdentifier="Windows" TargetPlatformVersion="v8.0" SdkName="SimpleMath" SdkVersion="1.0" />
      </Installation>
      <Prerequisites>
        <Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[14.0,16.0]" />
      </Prerequisites>
      <Dependencies>
        <Dependency Id="Microsoft.Framework.NDP" DisplayName="Microsoft .NET Framework" d:Source="Manual" Version="4.5" />
      </Dependencies>
      <Assets>
        <Asset Type="Microsoft.ExtensionSDK" d:Source="File" Path="SDKManifest.xml" />
      </Assets>
    </PackageManifest>
    
  7. 解决方案资源管理器中,选择 SimpleMathVSIX 项目。

  8. 在菜单栏上,依次选择“项目”>“添加新项”。

  9. 在“常用项”列表中,展开“数据”,然后选择“XML 文件”。

  10. 在“名称”框中,指定 SDKManifest.xml,然后选择添加按钮。

  11. 解决方案资源管理器中,打开 SDKManifest.xml 的快捷键菜单,选择“属性”,然后将“包括在 VSIX 中”属性的值更改为 True

  12. 用下列 XML 替换该文件的内容:

    C#

    <FileList
      DisplayName="WinRT Math Library (CS)"
      MinVSVersion="11.0"
      TargetFramework=".NETCore,version=v4.5"
      AppliesTo="WindowsAppContainer"
      SupportsMultipleVersions="Error"
      MoreInfo="https://msdn.microsoft.com/">
    </FileList>
    

    Visual Basic

    <FileList
      DisplayName="WinRT Math Library (VB)"
      MinVSVersion="11.0"
      TargetFramework=".NETCore,version=v4.5"
      AppliesTo="WindowsAppContainer"
      SupportsMultipleVersions="Error"
      MoreInfo="https://msdn.microsoft.com/">
    </FileList>
    
  13. 解决方案资源管理器中,打开 SimpleMathVSIX 项目的快捷键菜单,选择“添加”,然后选择“新文件夹”。

  14. 将该文件夹重命名为 references

  15. 打开“引用”文件夹的快捷键菜单,选择“添加”,然后选择“新文件夹”。

  16. 将子文件夹重命名为 commonconfiguration,在其中创建子文件夹,并将其命名为 neutral

  17. 重复前面的四个步骤,这次将第一个文件夹重命名为 redist

    项目现在包含以下文件夹结构:

    references\commonconfiguration\neutral
    redist\commonconfiguration\neutral
    
  18. 解决方案资源管理器中,打开 SimpleMath 项目的快捷键菜单,然后选择“在文件资源管理器中打开文件夹”。

  19. 文件资源管理器中,导航到 bin\Release 文件夹,打开 SimpleMath.winmd 文件的快捷键菜单,然后选择“复制”。

  20. 解决方案资源管理器中,将文件粘贴到 SimpleMathVSIX 项目中的 references\commonconfiguration\neutral 文件夹中。

  21. 重复上一步,将 SimpleMath.pri 文件粘贴到 SimpleMathVSIX 项目中的 redist\commonconfiguration\neutral 文件夹中。

  22. 解决方案资源管理器中,选择 SimpleMath.winmd

  23. 在菜单栏上,选择“查看”>“属性”(键盘:选择 F4 键)。

  24. 在“属性”窗口中,将“生成操作”属性更改为“内容”,然后将“包含在 VSIX 中”属性更改为 True

  25. 解决方案资源管理器中,对 SimpleMath.pri 重复此过程。

  26. 解决方案资源管理器中,选择 SimpleMathVSIX 项目。

  27. 在菜单栏上,依次选择“生成”>“生成 SimpleMathVSIX”。

  28. 解决方案资源管理器中,打开 SimpleMathVSIX 项目的快捷键菜单,然后选择“在文件资源管理器中打开文件夹”。

  29. 文件资源管理器中,导航到 \bin\Release 文件夹,然后运行 SimpleMathVSIX.vsix 以安装它。

  30. 选择安装按钮,等待安装完成,然后重启 Visual Studio。

创建使用类库的示例应用

  1. 在菜单栏上,依次选择“文件”>“新建”>“项目”。

  2. 在模板列表中,展开 Visual C#Visual Basic,然后选择“Microsoft Store”节点。

  3. 选择“空白应用”模板,将项目命名为 ArithmeticUI,然后选择确定按钮。

  4. 解决方案资源管理器中,打开 ArithmeticUI 项目的快捷键菜单,然后选择“添加”>“引用”。

  5. 在引用类型列表中,展开 Windows,然后选择“扩展”。

  6. 在详细内容窗格中,选择“WinRT 数学库”扩展。

    此时将显示有关 SDK 的其他信息。 可以选择要打开的“详细信息”链接以打开 https://msdn.microsoft.com/,如本演练前面的 SDKManifest.xml 文件中指定的那样。

  7. 在“引用管理器”对话框中,选择“WinRT 数学库”复选框,然后选择确定按钮。

  8. 在菜单栏上,选择“查看”>“对象浏览器”。

  9. 在“浏览”列表中,选择“简单数学”。

    现在可以浏览 SDK 中的内容。

  10. 解决方案资源管理器中,打开 MainPage.xaml 并将其内容替换为以下 XAML:

    C#

    <Page
        x:Class="ArithmeticUI.MainPage"
        IsTabStop="False"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:SimpleMath"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <TextBox x:Name="_firstNumber" HorizontalAlignment="Left" Margin="414,370,0,0" TextWrapping="Wrap" Text="First Number" VerticalAlignment="Top" Height="32" Width="135" TextAlignment="Center"/>
            <TextBox x:Name="_secondNumber" HorizontalAlignment="Left" Margin="613,370,0,0" TextWrapping="Wrap" Text="Second Number" VerticalAlignment="Top" Height="32" Width="135" TextAlignment="Center"/>
            <Button Content="+" HorizontalAlignment="Left" Margin="557,301,0,0" VerticalAlignment="Top" Height="39" Width="49" Click="OnOperatorClick"/>
            <Button Content="-" HorizontalAlignment="Left" Margin="557,345,0,0" VerticalAlignment="Top" Height="39" Width="49" Click="OnOperatorClick"/>
            <Button Content="*" HorizontalAlignment="Left" Margin="557,389,0,0" VerticalAlignment="Top" Height="39" Width="49" Click="OnOperatorClick"/>
            <Button Content="/" HorizontalAlignment="Left" Margin="557,433,0,0" VerticalAlignment="Top" Height="39" Width="49" Click="OnOperatorClick"/>
            <Button Content="=" HorizontalAlignment="Left" Margin="755,367,0,0" VerticalAlignment="Top" Height="39" Width="49" Click="OnResultsClick"/>
            <TextBox x:Name="_result" HorizontalAlignment="Left" Margin="809,370,0,0" TextWrapping="Wrap" Text="Result" VerticalAlignment="Top" Height="32" Width="163" TextAlignment="Center" IsReadOnly="True"/>
        </Grid>
    </Page>
    

    Visual Basic

    <Page
        x:Class="ArithmeticUI.MainPage"
        IsTabStop="False"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:SimpleMath"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <TextBox x:Name="_firstNumber" HorizontalAlignment="Left" Margin="414,370,0,0" TextWrapping="Wrap" Text="First Number" VerticalAlignment="Top" Height="32" Width="135" TextAlignment="Center"/>
            <TextBox x:Name="_secondNumber" HorizontalAlignment="Left" Margin="613,370,0,0" TextWrapping="Wrap" Text="Second Number" VerticalAlignment="Top" Height="32" Width="135" TextAlignment="Center"/>
            <Button Content="+" HorizontalAlignment="Left" Margin="557,301,0,0" VerticalAlignment="Top" Height="39" Width="49" Click="OnOperatorClick"/>
            <Button Content="-" HorizontalAlignment="Left" Margin="557,345,0,0" VerticalAlignment="Top" Height="39" Width="49" Click="OnOperatorClick"/>
            <Button Content="*" HorizontalAlignment="Left" Margin="557,389,0,0" VerticalAlignment="Top" Height="39" Width="49" Click="OnOperatorClick"/>
            <Button Content="/" HorizontalAlignment="Left" Margin="557,433,0,0" VerticalAlignment="Top" Height="39" Width="49" Click="OnOperatorClick"/>
            <Button Content="=" HorizontalAlignment="Left" Margin="755,367,0,0" VerticalAlignment="Top" Height="39" Width="49" Click="OnResultsClick"/>
            <TextBox x:Name="_result" HorizontalAlignment="Left" Margin="809,370,0,0" TextWrapping="Wrap" Text="Result" VerticalAlignment="Top" Height="32" Width="163" TextAlignment="Center" IsReadOnly="True"/>
        </Grid>
    </Page>
    
  11. 更新 MainPage.xaml.cs,使之与以下代码匹配:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace ArithmeticUI
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public static string operation = null;

        public MainPage()
        {
            this.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>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }

        /// <summary>
        /// Sets the operator chosen by the user
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnOperatorClick(object sender, RoutedEventArgs e)
        {
            operation = (sender as Button).Content.ToString();
        }

        /// <summary>
        /// Calls the SimpleMath SDK to do simple arithmetic
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnResultsClick(object sender, RoutedEventArgs e)
        {
            try
            {
                float firstNumber = float.Parse(this._firstNumber.Text);
                float secondNumber = float.Parse(this._secondNumber.Text);

                SimpleMath.Arithmetic math = new SimpleMath.Arithmetic();

                switch (operation)
                {
                    case "+":
                        this._result.Text = (math.add(firstNumber, secondNumber)).ToString();
                        break;
                    case "-":
                        this._result.Text = (math.subtract(firstNumber, secondNumber)).ToString();
                        break;
                    case "*":
                        this._result.Text = (math.multiply(firstNumber, secondNumber)).ToString();
                        break;
                    case "/":
                        this._result.Text = (math.divide(firstNumber, secondNumber)).ToString();
                        break;
                    default:
                        this._result.Text = "Choose operator";
                        break;
                }
            }
            catch
            {
                this._result.Text = "Enter valid #";
            }
        }
    }
}
  1. 选择 F5 键运行应用。

  2. 在应用中,输入任意两个数字,选择一个操作,然后选择 = 按钮。

    此时将显示正确的结果。

    已成功创建和使用扩展 SDK。