如何使用midlrt.exe将.idl编译成.winmd?
How to use midlrt.exe to compile .idl to .winmd?
背景: 我需要构建一个 Windows 运行时组件作为系统的一部分,该组件设置为使用 CMake 来生成它的构建系统。作为准备步骤,我尝试在命令行上构建它。
从基本的 .idl 文件开始 (MyType.idl)
namespace NS
{
[default_interface]
runtimeclass MyType
{
}
}
我正在尝试使用 midlrt.exe 工具生成匹配的 .winmd 文件。以下命令行(为了便于阅读,分为几行)
midlrt
/metadata_dir "%WindowsSdkDir%References\%WindowsSDKVersion%Windows.Foundation.FoundationContract.0.0.0"
/reference "%WindowsSdkDir%References\%WindowsSDKVersion%Windows.Foundation.FoundationContract.0.0.0\Windows.Foundation.FoundationContract.winmd"
/winmd MyType.winmd
/notlb
/winrt
/nomidl
/nologo
/enum_class
/ns_prefix
/client none
/server none
MyType.idl
生成 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
关于 /metadata_dir 的官方文档并没有增加太多内容(除了令人困惑的评论:"Use this switch to specify the location of the main metadata file for Windows, which is named windows.winmd.")。没有 /reference
.
的文档
以下是我需要帮助的内容:
- 我 真的 需要为
/metadata_dir
选项传递什么?正如在上面的命令行中使用的那样,它看起来像是 /reference
选项的一部分的冗余复制。但是,遗漏它会产生编译器错误。
- 如何确定所需
/reference
的列表,包括它们的特定版本?
需要 /metadata_dir 来告诉 MIDLRT 在哪里可以找到 MIDLRT 由于历史原因需要的基础类型的定义。实际上,这必须指向包含 winmd 的目录,该目录定义了 Windows SDK 中 Windows.Foundation 命名空间的类型,但如果您手头紧要,您可以使用 C:\Windows\System32\WinMetadata (因为前者很难追踪)。显然,您只想为 testing/experimentation 执行此操作,因为您会随心所欲地使用 OS 的任何构建,而您恰好在 运行 上。正确的形式看起来像这样:
midlrt sample.idl /metadata_dir "C:\Program Files (x86)\Windows Kits\References.0.18362.0\Windows.Foundation.FoundationContract.0.0.0"
找到这条路很棘手。首先在注册表中找到 SDK 安装路径。然后选择您希望定位的 SDK 版本。然后找到最新版本的基础合约。您可以在此处查看 C++/WinRT 如何执行此操作:
https://github.com/microsoft/xlang/blob/master/src/library/impl/cmd_reader_windows.h
/reference 是一项较新的功能,您可以使用它从 winmd 导入定义,而不必 import/include 使用 IDL 的定义。这主要是一种优化,因为这往往比包含相应的 IDL 定义要快得多。
无论您是否使用/reference,您仍然需要使用/metadata_dir,因为它们用于不同的事情。这与 cppwinrt.exe 不同,它只有一个统一的 -reference 标志。
背景: 我需要构建一个 Windows 运行时组件作为系统的一部分,该组件设置为使用 CMake 来生成它的构建系统。作为准备步骤,我尝试在命令行上构建它。
从基本的 .idl 文件开始 (MyType.idl)
namespace NS
{
[default_interface]
runtimeclass MyType
{
}
}
我正在尝试使用 midlrt.exe 工具生成匹配的 .winmd 文件。以下命令行(为了便于阅读,分为几行)
midlrt
/metadata_dir "%WindowsSdkDir%References\%WindowsSDKVersion%Windows.Foundation.FoundationContract.0.0.0"
/reference "%WindowsSdkDir%References\%WindowsSDKVersion%Windows.Foundation.FoundationContract.0.0.0\Windows.Foundation.FoundationContract.winmd"
/winmd MyType.winmd
/notlb
/winrt
/nomidl
/nologo
/enum_class
/ns_prefix
/client none
/server none
MyType.idl
生成 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
关于 /metadata_dir 的官方文档并没有增加太多内容(除了令人困惑的评论:"Use this switch to specify the location of the main metadata file for Windows, which is named windows.winmd.")。没有 /reference
.
以下是我需要帮助的内容:
- 我 真的 需要为
/metadata_dir
选项传递什么?正如在上面的命令行中使用的那样,它看起来像是/reference
选项的一部分的冗余复制。但是,遗漏它会产生编译器错误。 - 如何确定所需
/reference
的列表,包括它们的特定版本?
/metadata_dir 来告诉 MIDLRT 在哪里可以找到 MIDLRT 由于历史原因需要的基础类型的定义。实际上,这必须指向包含 winmd 的目录,该目录定义了 Windows SDK 中 Windows.Foundation 命名空间的类型,但如果您手头紧要,您可以使用 C:\Windows\System32\WinMetadata (因为前者很难追踪)。显然,您只想为 testing/experimentation 执行此操作,因为您会随心所欲地使用 OS 的任何构建,而您恰好在 运行 上。正确的形式看起来像这样:
midlrt sample.idl /metadata_dir "C:\Program Files (x86)\Windows Kits\References.0.18362.0\Windows.Foundation.FoundationContract.0.0.0"
找到这条路很棘手。首先在注册表中找到 SDK 安装路径。然后选择您希望定位的 SDK 版本。然后找到最新版本的基础合约。您可以在此处查看 C++/WinRT 如何执行此操作:
https://github.com/microsoft/xlang/blob/master/src/library/impl/cmd_reader_windows.h
/reference 是一项较新的功能,您可以使用它从 winmd 导入定义,而不必 import/include 使用 IDL 的定义。这主要是一种优化,因为这往往比包含相应的 IDL 定义要快得多。
无论您是否使用/reference,您仍然需要使用/metadata_dir,因为它们用于不同的事情。这与 cppwinrt.exe 不同,它只有一个统一的 -reference 标志。