创建软件开发工具包

软件开发工具包 (SDK) 是一系列 API,可以在 Visual Studio 中作为单个项进行引用。 “引用管理器”对话框中列出与项目相关的所有 SDK。 向项目添加 SDK 后,就可以在 Visual Studio 中使用这些 API 了。

有两种类型的 SDK:

  • 平台 SDK 是开发平台应用的必备组件。 例如,开发 Windows 8.x 应用商店应用需要 Windows 8.1 SDK。

  • 扩展 SDK 是用于扩展平台的可选组件,但为该平台开发应用时,扩展 SDK 并不是必需的。

以下部分介绍了 SDK 的一般基础结构,以及如何创建平台 SDK 和扩展 SDK。

平台 SDK

为平台开发应用需要平台 SDK。 例如,为 Windows 8.1 开发应用需要 Windows 8.1 SDK。

安装

所有平台 SDK 都将安装在 HKLM\Software\Microsoft\Microsoft SDKs\[TPI]\v[TPV]\@InstallationFolder = [SDK root]。 因此,Windows 8.1 SDK 安装在 HKLM\Software\Microsoft\Microsoft SDKs\Windows\v8.1

Layout

平台 SDK 的布局如下所示:

\[InstallationFolder root]
            SDKManifest.xml
            \References
                  \[config]
                        \[arch]
            \DesignTime
                  \[config]
                        \[arch]
节点 说明
References 文件夹 包含二进制文件,二进制文件中包含了可对其编码的 API。 这可能包括 Windows 元数据 (WinMD) 文件或程序集。
DesignTime 文件夹 包含仅在预运行/调试时所需的文件。 这些文件可能包括 XML 文档、库、标头、工具箱设计时二进制文件、MSBuild 项目等

理想情况下,XML 文档将放置在 \DesignTime 文件夹中,但引用的 XML 文档将继续与 Visual Studio 中的引用文件放在一起。 例如,引用 \References\[config]\[arch]\sample.dll 的 XML 文档将为 \References\[config]\[arch]\sample.xml,该文档的本地化版本将为 \References\[config]\[arch]\[locale]\sample.xml
Configuration 文件夹 只能有三个文件夹:DebugRetailCommonConfiguration。 无论 SDK 使用者的目标配置如何,如果应使用同一组 SDK 文件,则 SDK 作者都可以将其文件放置在 CommonConfiguration 下。
Architecture 文件夹 任何受支持的体系结构文件夹都可以存在。 Visual Studio 支持以下体系结构:x86、x64、ARM 和中立。 注意:Win32 映射到 x86,而 AnyCPU 映射到中立。

MSBuild 仅在平台 SDK 的 \CommonConfiguration\neutral 下查找。
SDKManifest.xml 此文件描述 Visual Studio 应如何使用 SDK。 查看适用于 Windows 8.1 的 SDK 清单:

<FileList DisplayName = "Windows" PlatformIdentity = "Windows, version=8.1" TargetFramework = ".NET for Windows Store apps, version=v4.5.1; .NET Framework, version=v4.5.1" MinVSVersion = "14.0"> <File Reference = "Windows.winmd"> <ToolboxItems VSCategory = "Toolbox.Default" /> </File> </FileList>

DisplayName:对象浏览器在“浏览”列表中显示的值。

PlatformIdentity:此属性的存在是为了告诉 Visual Studio 和 MSBuild 该 SDK 是平台 SDK,并且不应在本地复制从其中添加的引用。

TargetFramework:Visual Studio 使用此属性来确保只有以相同框架为目标框架(在该属性值中指定)的项目才能使用 SDK。

MinVSVersion:Visual Studio 可通过此属性以仅使用适用于它的 SDK。

Reference:必须仅为包含控件的引用指定此属性。 有关如何指定引用是否包含控件的信息,请参阅下文。

扩展 SDK

以下部分介绍了部署扩展 SDK 需要执行的操作。

安装

可以为特定用户或所有用户安装扩展 SDK,而无需指定注册表项。 若要为所有用户安装 SDK,请使用以下路径:

%Program Files%\Microsoft SDKs<target platform>\v<platform version number>\ExtensionSDKs

对于特定于用户的安装,请使用以下路径:

%USERPROFILE%\AppData\Local\Microsoft SDKs<target platform>\v<platform version number>\ExtensionSDKs

如果要使用其他位置,必须执行以下两项操作之一:

  1. 在注册表项中指定位置:

    HKLM\Software\Microsoft\Microsoft SDKs<target platform>\v<platform version number>\ExtensionSDKs<SDKName><SDKVersion>\

    并添加值为 <path to SDK><SDKName><SDKVersion> 的(默认)子项。

  2. 将 MSBuild 属性 SDKReferenceDirectoryRoot 添加到项目文件。 此属性的值是要引用的扩展 SDK 所在的目录的分号分隔列表。

安装布局

扩展 SDK 的安装布局如下所示:

\<ExtensionSDKs root>
           \<SDKName>
                 \<SDKVersion>
                        SDKManifest.xml
                        \References
                              \<config>
                                    \<arch>
                        \Redist
                              \<config>
                                    \<arch>
                        \DesignTime
                               \<config>
                                     \<arch>

  1. \<SDKName>\<SDKVersion>:扩展 SDK 的名称和版本派生自 SDK 根路径中的相应文件夹名称。 MSBuild 使用此标识在磁盘上查找 SDK,Visual Studio 在“属性”窗口和“引用管理器”对话框中显示此标识。

  2. References 文件夹:包含 API 的二进制文件。 这些文件可以是 Windows 元数据 (WinMD) 文件或程序集。

  3. Redist 文件夹:运行时/调试所需的文件,应打包为用户应用程序的一部分。 所有二进制文件都应放在 \redist\<config>\<arch> 下,二进制名称应采用以下格式来确保唯一性:]<公司>.<产品>.<用途>.<扩展>。例如,*Microsoft.Cpp.Build.dll。 名称可能与其他 SDK的文件名相冲突的所有文件(例如 javascript、css、pri、xaml、png 和 jpg 文件)都应放在 \redist\<config>\<arch>\<sdkname>* 下,但与 XAML 控件关联的文件除外。这些文件应放在 *\redist\<config>\<arch>\<componentname>\

  4. DesignTime 文件夹:仅在预运行/调试时间需要的文件,不应打包为用户应用程序的一部分。 这些文件可以是 XML 文档、库、标头、工具箱设计时二进制文件、MSBuild 项目等。 任何旨在供本机项目使用的 SDK 都必须具有 SDKName.props 文件。 下面显示了此类的文件的示例。

    <?xml version="1.0" encoding="utf-8"?>
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <ExecutablePath>C:\Temp\ExecutablePath;$(ExecutablePath)</ExecutablePath>
        <IncludePath>$(FrameworkSDKRoot)\..\v8.1\ExtensionSDKs\cppimagingsdk\1.0\DesignTime\CommonConfiguration\Neutral\include;$(IncludePath)</IncludePath>
        <AssemblyReferencePath>C:\Temp\AssemblyReferencePath;(AssemblyReferencePath)</AssemblyReferencePath>
        <LibraryPath>$(FrameworkSDKRoot)\..\v8.1\ExtensionSDKs\cppimagingsdk\1.0\DesignTime\Debug\ARM;$(LibraryPath)</LibraryPath>
        <SourcePath>C:\Temp\SourcePath\X64;$(SourcePath)</SourcePath>
        <ExcludePath>C:\Temp\ExcludePath\X64;$(ExcludePath)</ExcludePath>
        <_PropertySheetDisplayName>DevILSDK, 1.0</_PropertySheetDisplayName>
      </PropertyGroup>
    </Project>
    
    

    XML 引用文档与引用文件放在一起。 例如,\References\<config>\<arch>\sample.dll 程序集的 XML 引用文档为 \References\<config>\<arch>\sample.xml,该文档的本地化版本为 \References\<config>\<arch>\<locale>\sample.xml

  5. Configuration 文件夹:三个子文件夹:DebugRetailCommonConfiguration。 无论 SDK 使用者的目标配置如何,如果应使用同一组 SDK 文件,则 SDK 作者都可以将其文件放置在 CommonConfiguration 下。

  6. Architecture 文件夹:支持以下体系结构:x86、x64、ARM、中立。 Win32 映射到 x86,AnyCPU 映射到中立。

SDKManifest.xml

SDKManifest.xml 文件描述 Visual Studio 应如何使用 SDK。 以下是一个示例:

<FileList DisplayName = "My SDK"
          ProductFamilyName = "My SDKs"
          TargetFramework = ".NETCore, version=v4.5.1; .NETFramework, version=v4.5.1"
          MinVSVersion = "14.0"
          MaxPlatformVersion = "8.1"
          AppliesTo = "WindowsAppContainer + WindowsXAML"
          SupportPrefer32Bit = "True"
          SupportedArchitectures = "x86;x64;ARM"
          SupportsMultipleVersions = "Error"
          CopyRedistToSubDirectory = "."
          DependsOn = "SDKB, version=2.0"
          MoreInfo = "https://msdn.microsoft.com/MySDK">
  <File Reference = "MySDK.Sprint.winmd" Implementation = "XNASprintImpl.dll">
    <Registration Type = "Flipper" Implementation = "XNASprintFlipperImpl.dll" />
    <Registration Type = "Flexer" Implementation = "XNASprintFlexerImpl.dll" />
    <ToolboxItems VSCategory = "Toolbox.Default" />
  </File>
</FileList>

以下列表给出了文件的元素:

  1. DisplayName:显示在引用管理器、解决方案资源管理器、对象浏览器和 Visual Studio 用户界面中其他位置的值。

  2. ProductFamilyName:整体 SDK 产品名称。 例如,Windows JavaScript 库 (WinJS) SDK 名为“Microsoft.WinJS.1.0”和“Microsoft.WinJS.2.0”,属于同一 SDK 产品系列“Microsoft.WinJS”。 此属性允许 Visual Studio 和 MSBuild 建立该连接。 如果此属性不存在,则 SDK 名称将用作产品系列名称。

  3. FrameworkIdentity:指定一个或多个 Windows 组件库的依赖项。 此属性的值将放入使用文件的应用的清单中。 此属性仅适用于 Windows 组件库。

  4. TargetFramework:指定引用管理器和工具箱中可用的 SDK。 这是目标框架名字对象的分号分隔列表,例如“NET Framework, version=v2.0; .NET Framework, version=v4.5.1”。 如果指定了同一目标框架的多个版本,则引用管理器使用最低指定版本进行筛选。 例如,如果指定了“.NET Framework, version=v2.0; .NET Framework, version=v4.5.1”,则引用管理器将使用“.NET Framework, version=v2.0”。 如果指定了特定的目标框架配置文件,则引用管理器将仅使用该配置文件进行筛选。 例如,当指定“Silverlight, version=v4.0, profile=WindowsPhone”时,引用管理器仅筛选 Windows Phone 配置文件;以完整 Silverlight 4.0 框架为目标的项目在引用管理器中看不到 SDK。

  5. MinVSVersion:最低 Visual Studio 版本。

  6. MaxPlatformVerson:应使用最大目标平台版本来指定扩展 SDK 将不起作用的平台版本。 例如,Microsoft Visual C++ 运行时程序包 v11.0 应仅由 Windows 8 项目引用。 因此,Windows 8 项目的 MaxPlatformVersion 为 8.0。 这意味着引用管理器会筛选掉 Windows 8.1 项目的 Microsoft Visual C++ 运行时程序包,当 Windows 8.1 项目引用它时,MSBuild 会抛出错误。 注意:从 Visual Studio 2013 开始支持此元素。

  7. AppliesTo:通过指定适用的 Visual Studio 项目类型,指定引用管理器中可用的 SDK。 可识别九个值:WindowsAppContainer、VisualC、VB、CSharp、WindowsXAML、JavaScript、Managed 和 Native。 SDK 作者可以使用 and(“+”)、or(“|”)、not(“!”)运算符来准确地指定适用于 SDK 的项目类型的范围。

    WindowsAppContainer 标识 Windows 8.x 应用商店应用的项目。

  8. SupportPrefer32Bit:支持的值为“True”和“False”。 默认值为“true”。 如果该值设置为“False”,那么当引用 SDK 的项目启用 Prefer32Bit 后,MSBuild 将返回与 Windows 8.x 应用商店项目相关的错误(或与桌面项目相关的警告)。 有关 Prefer32Bit 的详细信息,请参阅“生成”页、“项目设计器”(C#)“编译”页、“项目设计器”(Visual Basic)。

  9. SupportedArchitectures:SDK 支持的以分号分隔的体系结构列表。 如果使用文件的项目中的目标 SDK 体系结构不受支持,MSBuild 将显示警告。 如果未指定该属性,则 MSBuild 永远不会显示此类的警告。

  10. SupportsMultipleVersions:如果该属性设置为 ErrorWarning,MSBuild 将指示同一项目不能引用同一 SDK 系列的多个版本。 如果此属性不存在或设置为 Allow,则 MSBuild 不会显示此类错误或警告。

  11. AppX:指定磁盘上 Windows 组件库的应用包路径。 此值在本地调试期间传递给 Windows 组件库的注册组件。 文件名的命名约定为 <公司>.<产品>.<体系结构>.<配置>.<版本>.appx。 如果配置和体系结构不适用于 Windows 组件库,那么它们在属性名称和属性值中是可选的。 此值仅适用于 Windows 组件库。

  12. CopyRedistToSubDirectory:指定应将 \redist 文件夹下的文件复制到相对于应用包根目录(即在“创建应用包向导”中选择的包位置)和运行时布局根目录的哪个位置。 默认位置是应用包和 F5 布局的根目录。

  13. DependsOn:SDK 标识的列表,用于定义此 SDK 所依赖的 SDK。 此属性显示在引用管理器的详细信息窗格中。

  14. MoreInfo:提供帮助和详细信息的网页的 URL。 此值用于引用管理器右窗格中的“详细信息”链接中。

  15. Registration Type:指定应用清单中的 WinMD 注册,并且本机 WinMD 需要该元素,因为本机 WinMD 具有对应的实现 DLL。

  16. File Reference:仅为包含控件的引用或本机 WinMD 引用指定。 有关如何指定引用是否包含控件的信息,请参阅下面的指定工具箱项的位置

指定工具箱项的位置

SDKManifest.xml 架构的 ToolBoxItems 元素指定平台和扩展 SDK 中工具箱项的控件名称、源程序集和工具箱选项卡名称。 以下示例展示了各种场景。 这适用于 WinMD 或 DLL 引用。

请注意,在 Visual Studio 2019 及更早版本中,Visual Studio 不会在清单中列出工具箱控件名称,而是动态枚举 SDK 程序集中的控件类型。 从 Visual Studio 2022 开始,不再支持此功能;工具箱项必须在 SDKManifest.xml 中显式列出。

  1. 将控件置于工具箱默认类别中。

    <File Reference = "sample.winmd">
      <ToolboxItems VSCategory = "Toolbox.Default">
        <Item Type = "Namespace.ControlName1" />
        <Item Type = "Namespace.ControlName2" />
      </ToolboxItems>
    </File>
    
  2. 将控件置于一个特定类别名称下。

    <File Reference = "sample.winmd">
      <ToolboxItems VSCategory= "MyCategoryName">
        <Item Type = "Namespace.ControlName1" />
        <Item Type = "Namespace.ControlName2" />
      </ToolboxItems>
    </File>
    
  3. 将控件置于多个特定类别名称下。

    <File Reference = "sample.winmd">
      <ToolboxItems VSCategory = "Graph">
        <Item Type = "Namespace.ControlName1" />
      </ToolboxItems>
      <ToolboxItems VSCategory = "Data">
        <Item Type = "Namespace.ControlName2" />
      </ToolboxItems>
    </File>
    
  4. 将控件置于 Blend 和 Visual Studio 中的不同类别名称下。

    // Blend accepts a slightly different structure for the category name because it allows a path rather than a single category.
    <File Reference = "sample.winmd">
      <ToolboxItems VSCategory = "Graph" BlendCategory = "Controls/sample/Graph">
        <Item Type = "Namespace.ControlName1" />
        <Item Type = "Namespace.ControlName2" />
      </ToolboxItems>
    </File>
    
  5. 在 Blend 和 Visual Studio 中以不同的方式枚举特定控件。

    <File Reference = "sample.winmd">
      <ToolboxItems VSCategory = "Graph">
        <Item Type = "Namespace.ControlName1" />
      </ToolboxItems>
      <ToolboxItems BlendCategory = "Controls/sample/Graph">
        <Item Type = "Namespace.ControlName2" />
      </ToolboxItems>
    </File>
    
  6. 枚举特定控件,并将控件置于 Visual Studio 通用路径下,或仅置于“所有控件组”中。

    <File Reference = "sample.winmd">
      <ToolboxItems VSCategory = "Toolbox.Common">
        <Item Type = "Namespace.ControlName1" />
      </ToolboxItems>
      <ToolboxItems VSCategory = "Toolbox.All">
        <Item Type = "Namespace.ControlName2" />
      </ToolboxItems>
    </File>
    
  7. 枚举特定控件,并在 ChooseItems 中仅显示一个特定集,而不让它们出现在工具箱中。

    <File Reference = "sample.winmd">
      <ToolboxItems VSCategory = "Toolbox.ChooseItemsOnly">
        <Item Type = "Namespace.ControlName1" />
        <Item Type = "Namespace.ControlName2" />
      </ToolboxItems>
    </File>