【问题标题】:Referencing C++ WinRT component from a Windows Store app project从 Windows 应用商店应用项目中引用 C++ WinRT 组件
【发布时间】:2013-12-24 00:42:14
【问题描述】:

我有一个 Windows 应用商店应用项目。在这个项目中,我想引用一个用 C++ 编写的 Windows 运行时组件。该组件可作为 DLL + WinMD 组合使用。但是我无法弄清楚如何做到这一点。我尝试将应用程序 VS 项目中的文件引用添加到 DLL 和 WinMD 文件,但我收到一条错误消息,提示无法添加 DLL。然后我尝试将其作为二进制文件添加到输出目录,但仍然没有运气。

我没有这个 WinRT 组件的源代码。我知道如果我有 WinRT 组件的 VS 项目,那么我可以简单地将我的应用程序项目中的引用添加到 WinRT 组件项目,这一切都可以正常工作。但如果是松散的 WinMD/DLL 文件,它就不起作用了。

我该怎么做?

【问题讨论】:

    标签: c# c++ windows-8 windows-runtime


    【解决方案1】:

    用 C# 编写的 WinRT 组件只生成一个文件,即包含元数据和组件实现的 winmd 文件。此外,同一个文件可用于所有架构(x86、x64 和 ARM)。

    但是,用 C++ 编写的 WinRT 组件会生成两个文件 - 一个包含元数据的 winmd 文件和一个包含实现的 DLL 文件。此外,每个体系结构的 DLL 文件都是独立的(x86、x64 和 ARM 各一个)。正因如此:

    • 只添加对 winmd 文件的引用没有意义(因为实现是在 DLL 中)
    • 添加对单个 DLL 文件的引用没有意义,需要根据您的项目配置/架构使用不同的 DLL

    当您将应用程序 VS 项目的引用添加到组件 VS 项目时,VS 项目系统会为您处理上述所有复杂性。但是,当您没有组件的源/项目时,您可以使用Extension SDK 机制。如果将所有三种架构的 DLL + WinMD 组合打包为扩展 SDK,则 VS 能够正确地将正确的配置/架构特定组件添加到应用程序输出中。

    有关 C++ WinRT 扩展 SDK 的真实示例,请查看Bing Maps SDK。安装 SDK,然后到以下文件夹查看扩展 SDK 的结构:

    C:\Users\\AppData\Local\Microsoft SDKs\Windows\v8.1\ExtensionSDKs\Bing.Maps.Xaml\1.313.0825.0

    请注意,您不一定需要在要使用项目的每台机器上安装扩展 SDK。目前 ESDK 是机器范围的实体(与 NuGet 不同),但可以使用 instructions here 在每个项目中创建它们。

    【讨论】:

    • 我想知道是否有一些简单的方法可以通过更新 csproj 文件来引用正确的二进制文件来引用本机 WinRT 组件,而无需创建扩展 SDK...
    • 我对这些玩得还不够,但据我所知——如果你安装扩展 SDK 并在商店应用程序中引用它——它就可以工作,但如果你签入源代码会怎样代码到 GIT 或 TFS 或以其他方式共享 - 这是否意味着每个人都需要在构建项目之前安装该扩展 SDK?那么构建服务器呢?
    • 基本问题是原生组件是特定于架构的,因此即使您编辑 csproj(或任何 VS 项目文件),您也需要确保它创建特定于架构的输出并引用正确的架构本机组件。另外,我已经编辑了答案,并附上了关于使征募友好的扩展 SDK 的提示
    • 哦,看来奥伦去年已经写过这个了! :) 很高兴听到这是可能的。您基本上将 SDKReferenceDirectoryRoot 属性放在 csproj 中,以便能够从给定文件夹而不是机器范围的 SDK 存储中获取 SDK...
    • 最后一段中的超链接失效了。虽然文本仍然可以通过archive.org snapshot 获得,但不幸的是,所有图像都消失了。
    猜你喜欢
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多