背景:--我需要构建一个Windows组件,作为系统的一部分,该系统是为了使用https://cmake.org/来生成其构建系统而设置的。作为准备步骤,我试图在命令行上构建它。
从基本的.idl文件(MyType.idl)开始
namespace NS
{
[default_interface]
runtimeclass MyType
{
}
}我正在尝试使用.winmd工具生成一个匹配的midlrt.exe文件。以下命令行(为提高可读性,可分几行)
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生成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关于目录的官方文档并没有增加太多内容(除了一个令人困惑的注释:“使用此开关指定windows.winmd的主元数据文件的位置”)。没有关于/reference的文档。
以下是我需要的帮助:
/metadata_dir选项,我真正需要的是什么?正如在上面的命令行中使用的那样,它看起来像是部分/reference选项的冗余复制。不过,将其排除在外会产生编译器错误。/reference的列表,包括它们的特定版本?发布于 2019-07-01 16:48:26
/metadata_dir需要告诉MIDLRT,它可以在哪里找到MIDLRT由于历史原因而需要的基本类型的定义。实际上,这必须指向包含winmd的目录,该目录从Windows中的Windows.Foundation命名空间中定义类型,但如果需要使用C:\Windows\System32 32\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是如何做到这一点的:
/reference是一个较新的特性,您可以使用它从winmd导入定义,而不必使用IDL导入/包含定义。这主要是一种优化,因为这比包含相应的IDL定义要快得多。
您仍然需要使用/metadata_dir,而不管您是否使用/reference,因为它们用于不同的事情。这与cppwinrt.exe不同,后者只有一个统一的-reference标志。
https://stackoverflow.com/questions/56823779
复制相似问题