Windows runtime 如何使用midlrt.exe将.idl编译为.winmd?

Windows runtime 如何使用midlrt.exe将.idl编译为.winmd?,windows-runtime,c++-winrt,midl,winrt-component,Windows Runtime,C++ Winrt,Midl,Winrt Component,背景:我需要构建一个Windows运行时组件,作为系统的一部分,该系统被设置为用于生成其构建系统。作为准备步骤,我正在尝试在命令行上构建它 从一个裸体的.idl文件(MyType.idl)开始 NS { [默认_接口] 运行时类MyType { } } 我正在尝试使用该工具生成一个匹配的.winmd文件。下面的命令行(为了可读性,分成几行) midlrt /Meta AddiaTadir“%WINDOWSDSKDR%引用”%WINDOWSDKVIEST% Windows .Frase.Fuf

背景:我需要构建一个Windows运行时组件,作为系统的一部分,该系统被设置为用于生成其构建系统。作为准备步骤,我正在尝试在命令行上构建它


从一个裸体的.idl文件(MyType.idl)开始

NS
{
[默认_接口]
运行时类MyType
{
}
}
我正在尝试使用该工具生成一个匹配的.winmd文件。下面的命令行(为了可读性,分成几行)

midlrt
/Meta AddiaTadir“%WINDOWSDSKDR%引用”%WINDOWSDKVIEST% Windows .Frase.Fuffic Prase\3.0.0.0
引用“%WINDOWSDSKDR%引用”%WINDOWSDSKVIEW%WINDOWS .FAST.Basic契约\3.0.0.0\Windows .Fase.基础合同.WINMD“
/winmd MyType.winmd
/notlb
/温特
/诺米德尔
/诺洛戈
/枚举类
/ns_前缀
/客户无
/服务器无
MyType.idl
生成MyType.winmd文件很好,但我不知道为什么。我对
/metadata\u dir
/reference
选项特别困惑。运行
midlrt/help
提供以下功能:

/metadata\u dir指定一个或多个包含平台元数据文件的目录
/引用指定要导入的一个或多个WinMD文件
关于的官方文档对此没有太多补充(除了一句令人困惑的评论:“使用此开关指定Windows主元数据文件的位置,该文件名为Windows.winmd。”)。没有关于
/reference
的文档

以下是我需要的帮助:

  • 对于
    /metadata\u dir
    选项,我真正需要传递什么?在上面的命令行中使用时,它看起来像是
    /reference
    选项的一部分的冗余复制。但是,忽略它会产生编译器错误
  • 如何确定所需的
    /reference
    列表,包括其特定版本

/metadata\u dir需要告诉MIDLRT在哪里可以找到MIDLRT出于历史原因需要的基本类型的定义。实际上,这必须指向包含WINMD的目录,WINMD从Windows SDK中的Windows .FraseNe命S空间定义类型,但是如果您处于压缩状态(前一个很难跟踪),则可以使用C:\Windows \Stase3\WINMeta。显然,您只想在测试/实验中这样做,因为无论您运行的是什么操作系统构建,您都会心血来潮。正确的形式如下所示:

<代码> MIDLRT SAMPL.IDL/Meta Addiadir“C:\程序文件(x86)\ Windows工具包\ 10个引用\\0.0.18362.0 \ Windows .Fase.基础合同\3.0.0.0”

找到这条路很难。首先在注册表中查找SDK安装路径。然后选择您希望针对的SDK版本。然后找到最新版本的基础合同。您可以在这里了解C++/WinRT是如何做到这一点的:

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


无论是否使用/reference,您仍然需要使用/metadata\u dir,因为它们用于不同的事情。这与CPPWRR.EXE不同,在这里只有一个协调引用标志。

SO“代码> /参考< /COD>在IDL中与编译器在C++代码中的切换相同,其目的是扩展相应文件,就像它被包含在代码中一样。这就回答了这个问题。我仍然需要帮助确定如何确定
/metadata\u dir
参数。C++/WinRT VSIX似乎做得很好,但我很难弄清楚它是如何将所需位置收集到生成的响应文件中的。有关于这方面的文档吗?我已经扩展了我的答案来描述这一点。