首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用midlrt.exe将.idl编译成.winmd?

如何使用midlrt.exe将.idl编译成.winmd?
EN

Stack Overflow用户
提问于 2019-06-30 09:31:18
回答 1查看 917关注 0票数 3

背景:--我需要构建一个Windows组件,作为系统的一部分,该系统是为了使用https://cmake.org/来生成其构建系统而设置的。作为准备步骤,我试图在命令行上构建它。

从基本的.idl文件(MyType.idl)开始

代码语言:javascript
复制
namespace NS
{
    [default_interface]
    runtimeclass MyType
    {
    }
}

我正在尝试使用.winmd工具生成一个匹配的midlrt.exe文件。以下命令行(为提高可读性,可分几行)

代码语言:javascript
复制
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提供了以下功能:

代码语言:javascript
复制
/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的列表,包括它们的特定版本?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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是如何做到这一点的:

windows.h

/reference是一个较新的特性,您可以使用它从winmd导入定义,而不必使用IDL导入/包含定义。这主要是一种优化,因为这比包含相应的IDL定义要快得多。

您仍然需要使用/metadata_dir,而不管您是否使用/reference,因为它们用于不同的事情。这与cppwinrt.exe不同,后者只有一个统一的-reference标志。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56823779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档