65.9K
CodeProject 正在变化。 阅读更多。
Home

将 Windows Runtime 组件项目部署为 Visual Studio Extension SDK

2013年1月3日

CPOL

6分钟阅读

viewsIcon

23830

downloadIcon

184

本文旨在弥补关于如何将 Windows Runtime 组件项目部署为 Visual Studio 扩展 SDK 的更详细信息的不足。

引言

Visual Studio 2012 提供了构建 Windows Runtime 组件的可能性。这些组件可以用任何 WinRT 语言(C#、C++、VB 和 JavaScript)构建,并可以被用这些语言编写的任何其他项目使用。当两个项目都在同一个解决方案中时,简单的项目到项目引用就可以使 WinRT 组件项目共享的控件可供引用它的项目使用。当需要引用不同解决方案中的项目时,就会出现一个更大的问题。一个很好的方法是将 WinRT 组件分发为扩展 SDK。扩展 SDK 是一个可安装的包,可以简化组件消费者的使用。通过引用已安装的扩展,它的所有功能都会暴露给用户。另一方面,SDK 构建者的工作并不那么轻松。网上关于这个主题的文档很少,即使找到,也可能无法满足开发者的所有需求。本文旨在深入研究 VSIX 包的构建,特别是作为扩展 SDK,以便开发者揭开其隐藏的秘密,使包的构建操作更加直观。

背景

在构建一个包含多个 WinRT 组件的项目时,我开始思考如何分发它。出于商业目的,我认为将其分发为扩展 SDK 是最好的,因为它为组件的消费者留下了非常干净的工作。经过短暂的研究,我在网上找到了一些关于如何构建扩展 SDK 的参考:官方的 MSDN 参考 和 Tim Heuer 博客上的一个非常好的教程。当我遵循这两个参考时,教程的完成相对容易,没有大的问题。当我不得不构建我们真正的扩展 SDK,包含对二进制文件、第三方库、图像资源、XAML 文件等的多个引用时,我感到困惑,因为教程并没有涵盖我们所需的所有要点。通过更仔细地查看 MSDN 文档并进行一些试错,我们得以使扩展 SDK 按预期工作。

示例解决方案

为了重现一个可以让我们面对自定义控件或用户控件中最常见情况的环境,我决定创建一个非常简单的解决方案,它使用了

  • 引用 C# Windows 组件项目
  • 由于它仅通过其 .winmd 文件引用,因此它提供了一种非常简单的方式来在 SDK 扩展中使用引用。
  • 引用 C++ Windows 组件项目
  • 在此类项目中,元数据和实现位于不同的文件中,因此这是一个很好的项目来
  • 嵌入在 .pri 项目文件中的 .resw 资源文件
  • 当资源嵌入到项目 pri 文件中时,我可以验证 VISX 项目文件夹结构中使用的正确引用。
  • 运行时引用复制到输出文件夹的资源
  • 取决于项目逻辑,这可能是一种非常常见的情况。
为了满足这些要求,示例解决方案共享一个公共用户控件,该控件简单地访问 C# 和 C++ 项目以获取数字的平方来计算三角形的斜边。控件的标题使用嵌入式资源来显示文本,而“计算”按钮旁边的文本是从输出文件夹中的内容文件中运行时读取的。

部署为 SDK 扩展

以下步骤使用了 Microsoft Visual Studio 2012 SDK

第一步是在 Visual Studio 中创建一个新项目,选择“新建项目”>>“Visual C#”>>“Extensibility”>>“VSIX Project”。

项目创建后,让我们创建一个新项:**“添加新项”>>“Visual C# 项”>>“Data”>>“XML File”**,并将其命名为 SDKManifest.xml。现在,将其内容更改为类似以下内容(请记住更改适合您应用程序的值;不要在意文件,我们稍后会处理它们)

<FileList
	DisplayName="SDK Extension Deploy Sample"
	TargetFramework=".NETCore, version=v4.5"
	DependsOn="Microsoft.VCLibs, version=11.0"
	MinVSVersion="11.0"
	SupportedArchitectures="x86;x64;ARM"
	AppliesTo="WindowsAppContainer + ( Managed | Native )"
  />

  <File Reference = "WinRTComponent.winmd">
	<ToolboxItems VSCategory = "WinRT Component Controls" BlendCategory="WinRT Component Controls" />
  </File>
  <File Reference = "ControlDependencyProject.winmd"/>
  <File Reference = "ControlDependencyProjectCpp.winmd" Implementation = "ControlDependencyProjectCpp.dll"/>
</FileList>

然后,让我们开始更改 visixmanifest,设置 ProductName、ProductID 和 Author。在 InstallTargets 选项卡上,将 Install 类型更改为 Extension SDK,并填写 SDK 名称和版本字段。在 Assets 选项卡上,添加一个 ExtensionSDK 类型的 Asset,Source 选择 File on file system,并在 Path Dropbox 中选择 SDKManifest.xml

文件结构

现在我们将构建部署 SDK 所需的文件结构。此结构已在 MSDN 参考 中有详细文档,我们将参照它来解释我们创建的结构的每个部分。

  • References 分支
  • 此文件夹分支必须具有以下结构:references/commmonconfiguration/neutral

    在 neutral 文件夹中,我们将复制我们 userControl 项目中的 WinMd 文件以及我们项目依赖的所有项目的 WinMd 文件。

  • Redist 分支
  • 这些文件夹将包含我们项目使用的所有代码二进制文件和资源。

    此文件夹分支必须具有以下结构

    • redist/commmonconfiguration/neutral
    • redist/debug/[Arch]
    • redist/retail/[Arch]

    [Arch] 将是 SDKManifest.xml 中详细说明的所有 SupportedArchitectures。在 [Arch] 文件夹内,我们将复制解决方案使用的二进制文件,并尊重架构。

    neutral 文件夹将包含我们项目的 .pri 文件(我们项目的 Resourcer.resw 将嵌入在此文件中)。

    XAML、资源、图像或项目使用的任何其他需要位于输出文件夹中的内容 **必须** 放置在新文件夹中,例如 redist/commmonconfiguration/neutral/[Project Name]

对于我们的示例解决方案,我们将拥有此文件结构。

现在我们已经添加了所有文件,我们必须将它们全部包含在我们的项目中(如果尚未包含)。

之后,我们需要选择这两个分支的所有文件以及 SDKManifest.xml,然后更改它们的属性(选择文件 >> 右键单击 >> 属性),并将 BuildAction 设置为 Content,将 Include in VSIX 设置为 True。

SDKManifest 的最终更改

现在我们已经完成了所有工作,我们需要在 SDKManifest 中标记引用。在 File 列表中,我们需要添加项目使用的所有引用。

对于每个引用,我们将添加一个 <File/> 标签,使用 Reference 属性提供我们在 Reference 分支中的 winmd 文件名。

对于元数据与实现分离的引用,我们需要添加 Implementation 属性,其中包含位于我们 [Arch] 文件夹内的二进制文件名。

如果您的项目包含用户控件或自定义控件,并且您希望在 Visual Studio 工具箱中显示这些控件,您需要在 file 标签内设置 <ToolboxItems/> 标签。更多详细信息请参阅 MSDN 参考

备注

这是我在 CodeProject 上的第一篇文章,我希望我能为开发者社区和这个论坛贡献我在这里学到的至少 1% 的知识。由于这是我的第一篇文章,请随时提供任何建议或建设性的意见。

历史

这是第一个版本,计划稍后进行更改日志。

© . All rights reserved.