如何在 Win32 桌面应用程序中使用自定义 WinRT 库?

How to use a custom WinRT library in a Win32 desktop app?

我的基于 Win32 的桌面应用程序中有一个 WinRT class(C++/CX 参考 class)。它访问 WinRT API 并且工作正常。我用 this guide 让它工作。现在我试图将此 class 放入桌面应用程序可以使用的库中。我在这方面遇到了很多麻烦。这是我在 Visual Studio 2013 年所做的事情:

  1. 通过选择 Installed > Templates> Visual C++ > Store Apps > Windows Apps > DLL (Windows).[=28 创建了一个新项目=]
  2. 将这个新的 DLL 项目添加到包含我的桌面应用程序的解决方案中。
  3. 添加了对 DLL 项目的引用
  4. 配置属性 > C/C++ > 常规 > 附加#using 目录 中,我添加了 DLL 项目构建 .winmd 文件的目录。
  5. 在桌面应用程序的 .cpp 文件中,我添加了:
#using <MyLib.winmd>
#using <Windows.winmd>
#using <Platform.winmd>

[MTAThread] // initializes WinRT runtime
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow) {
    MyWinRTClass^ myObject = ref new MyWinRTClass();
}

Intellisense 工作,我编写了代码来实例化库中的 class。桌面应用程序构建,但当它运行时我得到:

First-chance exception at 0x76494598 in MyDesktopApp.exe: Microsoft C++ exception: Platform::ClassNotRegisteredException ^ at memory location 0x00A8F99C.

这是怎么回事?这是正确的方法吗?

截至 2019 年 7 月 26 日的更新:请参阅以下线程中 "Adam Braden - MSFT" 的评论。

这是不可能的。为了让应用程序使用自定义 WinRT 组件,该组件首先需要 "registered"。对于打包的 (AppX) 应用程序,这是通过将一些信息添加到包的 AppXManifest.xml 中来完成的。但是对于常规的 Win32 桌面应用程序,现在可以进行此类注册。您可以直接调用 OS 提供的 WinRT API,但不能写入您自己的自定义 WinRT API 以供其他应用程序使用。