创建软件开发工具包
软件开发工具包 (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 文件夹 | 只能有三个文件夹:Debug、Retail 和 CommonConfiguration。 无论 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
如果要使用其他位置,必须执行以下两项操作之一:
在注册表项中指定位置:
HKLM\Software\Microsoft\Microsoft SDKs<target platform>\v<platform version number>\ExtensionSDKs<SDKName><SDKVersion>\
并添加值为
<path to SDK><SDKName><SDKVersion>
的(默认)子项。将 MSBuild 属性
SDKReferenceDirectoryRoot
添加到项目文件。 此属性的值是要引用的扩展 SDK 所在的目录的分号分隔列表。
安装布局
扩展 SDK 的安装布局如下所示:
\<ExtensionSDKs root>
\<SDKName>
\<SDKVersion>
SDKManifest.xml
\References
\<config>
\<arch>
\Redist
\<config>
\<arch>
\DesignTime
\<config>
\<arch>
\<SDKName>\<SDKVersion>:扩展 SDK 的名称和版本派生自 SDK 根路径中的相应文件夹名称。 MSBuild 使用此标识在磁盘上查找 SDK,Visual Studio 在“属性”窗口和“引用管理器”对话框中显示此标识。
References 文件夹:包含 API 的二进制文件。 这些文件可以是 Windows 元数据 (WinMD) 文件或程序集。
Redist 文件夹:运行时/调试所需的文件,应打包为用户应用程序的一部分。 所有二进制文件都应放在 \redist\<config>\<arch> 下,二进制名称应采用以下格式来确保唯一性:]<公司>.<产品>.<用途>.<扩展>。例如,*Microsoft.Cpp.Build.dll。 名称可能与其他 SDK的文件名相冲突的所有文件(例如 javascript、css、pri、xaml、png 和 jpg 文件)都应放在 \redist\<config>\<arch>\<sdkname>* 下,但与 XAML 控件关联的文件除外。这些文件应放在 *\redist\<config>\<arch>\<componentname>\。
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。
Configuration 文件夹:三个子文件夹:Debug、Retail 和 CommonConfiguration。 无论 SDK 使用者的目标配置如何,如果应使用同一组 SDK 文件,则 SDK 作者都可以将其文件放置在 CommonConfiguration 下。
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>
以下列表给出了文件的元素:
DisplayName:显示在引用管理器、解决方案资源管理器、对象浏览器和 Visual Studio 用户界面中其他位置的值。
ProductFamilyName:整体 SDK 产品名称。 例如,Windows JavaScript 库 (WinJS) SDK 名为“Microsoft.WinJS.1.0”和“Microsoft.WinJS.2.0”,属于同一 SDK 产品系列“Microsoft.WinJS”。 此属性允许 Visual Studio 和 MSBuild 建立该连接。 如果此属性不存在,则 SDK 名称将用作产品系列名称。
FrameworkIdentity:指定一个或多个 Windows 组件库的依赖项。 此属性的值将放入使用文件的应用的清单中。 此属性仅适用于 Windows 组件库。
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。
MinVSVersion:最低 Visual Studio 版本。
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 开始支持此元素。
AppliesTo:通过指定适用的 Visual Studio 项目类型,指定引用管理器中可用的 SDK。 可识别九个值:WindowsAppContainer、VisualC、VB、CSharp、WindowsXAML、JavaScript、Managed 和 Native。 SDK 作者可以使用 and(“+”)、or(“|”)、not(“!”)运算符来准确地指定适用于 SDK 的项目类型的范围。
WindowsAppContainer 标识 Windows 8.x 应用商店应用的项目。
SupportPrefer32Bit:支持的值为“True”和“False”。 默认值为“true”。 如果该值设置为“False”,那么当引用 SDK 的项目启用 Prefer32Bit 后,MSBuild 将返回与 Windows 8.x 应用商店项目相关的错误(或与桌面项目相关的警告)。 有关 Prefer32Bit 的详细信息,请参阅“生成”页、“项目设计器”(C#) 或“编译”页、“项目设计器”(Visual Basic)。
SupportedArchitectures:SDK 支持的以分号分隔的体系结构列表。 如果使用文件的项目中的目标 SDK 体系结构不受支持,MSBuild 将显示警告。 如果未指定该属性,则 MSBuild 永远不会显示此类的警告。
SupportsMultipleVersions:如果该属性设置为 Error 或 Warning,MSBuild 将指示同一项目不能引用同一 SDK 系列的多个版本。 如果此属性不存在或设置为 Allow,则 MSBuild 不会显示此类错误或警告。
AppX:指定磁盘上 Windows 组件库的应用包路径。 此值在本地调试期间传递给 Windows 组件库的注册组件。 文件名的命名约定为 <公司>.<产品>.<体系结构>.<配置>.<版本>.appx。 如果配置和体系结构不适用于 Windows 组件库,那么它们在属性名称和属性值中是可选的。 此值仅适用于 Windows 组件库。
CopyRedistToSubDirectory:指定应将 \redist 文件夹下的文件复制到相对于应用包根目录(即在“创建应用包向导”中选择的包位置)和运行时布局根目录的哪个位置。 默认位置是应用包和 F5 布局的根目录。
DependsOn:SDK 标识的列表,用于定义此 SDK 所依赖的 SDK。 此属性显示在引用管理器的详细信息窗格中。
MoreInfo:提供帮助和详细信息的网页的 URL。 此值用于引用管理器右窗格中的“详细信息”链接中。
Registration Type:指定应用清单中的 WinMD 注册,并且本机 WinMD 需要该元素,因为本机 WinMD 具有对应的实现 DLL。
File Reference:仅为包含控件的引用或本机 WinMD 引用指定。 有关如何指定引用是否包含控件的信息,请参阅下面的指定工具箱项的位置。
指定工具箱项的位置
SDKManifest.xml 架构的 ToolBoxItems 元素指定平台和扩展 SDK 中工具箱项的控件名称、源程序集和工具箱选项卡名称。 以下示例展示了各种场景。 这适用于 WinMD 或 DLL 引用。
请注意,在 Visual Studio 2019 及更早版本中,Visual Studio 不会在清单中列出工具箱控件名称,而是动态枚举 SDK 程序集中的控件类型。 从 Visual Studio 2022 开始,不再支持此功能;工具箱项必须在 SDKManifest.xml 中显式列出。
将控件置于工具箱默认类别中。
<File Reference = "sample.winmd"> <ToolboxItems VSCategory = "Toolbox.Default"> <Item Type = "Namespace.ControlName1" /> <Item Type = "Namespace.ControlName2" /> </ToolboxItems> </File>
将控件置于一个特定类别名称下。
<File Reference = "sample.winmd"> <ToolboxItems VSCategory= "MyCategoryName"> <Item Type = "Namespace.ControlName1" /> <Item Type = "Namespace.ControlName2" /> </ToolboxItems> </File>
将控件置于多个特定类别名称下。
<File Reference = "sample.winmd"> <ToolboxItems VSCategory = "Graph"> <Item Type = "Namespace.ControlName1" /> </ToolboxItems> <ToolboxItems VSCategory = "Data"> <Item Type = "Namespace.ControlName2" /> </ToolboxItems> </File>
将控件置于 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>
在 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>
枚举特定控件,并将控件置于 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>
枚举特定控件,并在 ChooseItems 中仅显示一个特定集,而不让它们出现在工具箱中。
<File Reference = "sample.winmd"> <ToolboxItems VSCategory = "Toolbox.ChooseItemsOnly"> <Item Type = "Namespace.ControlName1" /> <Item Type = "Namespace.ControlName2" /> </ToolboxItems> </File>