IIn*_*ble 3 midl windows-runtime winrt-component c++-winrt
背景:我需要构建一个 Windows 运行时组件,作为设置为使用CMake生成其构建系统的系统的一部分。作为准备步骤,我试图在命令行上构建它。
从一个简单的 .idl 文件 (MyType.idl) 开始
namespace NS
{
[default_interface]
runtimeclass MyType
{
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用midlrt.exe工具生成匹配的 .winmd 文件。下面的命令行(为了可读性分成几行)
midlrt
/metadata_dir "%WindowsSdkDir%References\%WindowsSDKVersion%Windows.Foundation.FoundationContract\3.0.0.0"
/reference "%WindowsSdkDir%References\%WindowsSDKVersion%Windows.Foundation.FoundationContract\3.0.0.0\Windows.Foundation.FoundationContract.winmd"
/winmd MyType.winmd
/notlb
/winrt
/nomidl
/nologo
/enum_class
/ns_prefix
/client none
/server none
MyType.idl
Run Code Online (Sandbox Code Playgroud)
生成 MyType.winmd 文件就好了,但我不知道为什么。我对/metadata_dir和/reference选项特别困惑。跑步midlrt /help提供以下功能:
/metadata_dir Specify one or more directories containing platform metadata files
/reference Specify one or more WinMD files to import
Run Code Online (Sandbox Code Playgroud)
/metadata_dir上的官方文档对此没有增加太多(除了令人困惑的评论:“使用此开关指定 Windows 的主元数据文件的位置,该文件名为 windows.winmd。”)。没有关于/reference.
以下是我需要帮助的内容:
/metadata_dir选项传递什么?正如上面命令行中使用的那样,它看起来像是部分/reference选项的冗余复制。但是,忽略它会产生编译器错误。/reference的列表,包括它们的特定版本?/metadata_dir 需要告诉 MIDLRT 在哪里可以找到 MIDLRT 由于历史原因需要的基础类型的定义。实际上,这必须指向包含定义来自 Windows SDK 中的 Windows.Foundation 命名空间的类型的 winmd 的目录,但是如果您处于紧要关头,您可以使用 C:\Windows\System32\WinMetadata(因为前者很难追查)。显然,您只想在测试/实验中执行此操作,因为您会随心所欲地选择碰巧运行的操作系统的任何版本。正确的形式如下所示:
midlrt sample.idl /metadata_dir "C:\Program Files (x86)\Windows Kits\10\References\10.0.18362.0\Windows.Foundation.FoundationContract\3.0.0.0"
找到这条路很棘手。首先在注册表中找到 SDK 安装路径。然后选择您希望定位的 SDK 版本。然后找到最新版本的基础合约。您可以在此处查看 C++/WinRT 如何做到这一点:
https://github.com/microsoft/xlang/blob/master/src/library/impl/cmd_reader_windows.h
/reference 是一项较新的功能,您可以使用它从 winmd 导入定义,而不必使用 IDL 导入/包含定义。这主要是一种优化,因为这往往比包含相应的 IDL 定义要快得多。
无论您是否使用 /reference ,您仍然需要使用 /metadata_dir ,因为它们用于不同的事情。这与 cppwinrt.exe 不同,后者只有一个统一的 -reference 标志。