【发布时间】:2014-03-12 07:41:20
【问题描述】:
我有一个问题,给定一个 .winmd 文件,我们在哪里可以找到真正的实现? .winmd 文件就像头文件或动态库的 .lib 文件一样,它不包含任何实现,我很好奇它的实现在哪里。 谢谢。
【问题讨论】:
-
为什么需要知道问题的答案?是闲散的好奇心还是您对答案有技术需求?
标签: .net windows-runtime winmd
我有一个问题,给定一个 .winmd 文件,我们在哪里可以找到真正的实现? .winmd 文件就像头文件或动态库的 .lib 文件一样,它不包含任何实现,我很好奇它的实现在哪里。 谢谢。
【问题讨论】:
标签: .net windows-runtime winmd
免责声明:此答案描述了未记录的实施细节,可能随时更改,恕不另行通知。
对于在 Windows.winmd 或 C:\windows\system32\WinMetadata 中的任何 .winmd 中定义的类型,注册表会将您指向实际的实现。
在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\SystemSettings.DataModel.SettingsDatabase 处查找类型的名称,DllPath 值将包含实现该类型的 DLL。
【讨论】:
你不能。 .winmd 文件只包含类型声明,不包含任何代码。它与 COM 自动化中使用的类型库 (.tlb) 完全等效。 C 或 C++ 程序中的 .h 文件的逻辑等效项。
.tlb 格式限制太多,无法支持 WinRT,因此重新设计为 .winmd,文件格式与 .NET 元数据相同,您可以使用 .NET 工具(如 ildasm.exe)查看其内容.编译器使用它来知道如何生成正确的代码以使用 WinRT 组件,就像 C++ 编译器通过#include 包含类声明的 .h 文件知道如何使用类库一样。
就像 .h 文件一样,由您决定哪些可执行文件实现了这些类型并将其部署到用户的机器上。除非它是声明所有内置 WinRT 类型的 Windows.winmd,否则您会期望二进制组件非常接近 .winmd 文件。 Store 要求您在包中包含该二进制组件。如果您需要帮助,请向组件的作者寻求帮助。
【讨论】:
Hans 非常准确。 winmd 文件仅描述类型的形状(用于运行时的 CLR 和 JS 语言投影以及编译时的 C++ 编译器)。在运行时,RoActivateInstance API(或 RoGetActivationFactory API)采用类型名称并返回实现该类型的对象。
对于特定应用类型,包清单的ActivatableClassId 条目描述了运行时类的实现位置。对于系统特定类型,它位于注册表中,但该类型的位置可能会在将来随时更改。
【讨论】: