5

我有一个问题,给定一个 .winmd 文件,我们在哪里可以找到真正的实现?.winmd 文件就像头文件或动态库的 .lib 文件一样,它不包含任何实现,我很好奇它的实现在哪里。谢谢。

4

3 回答 3

6

免责声明:此答案描述了未记录的实现细节,这些细节可以随时更改,恕不另行通知。

对于在 Windows.winmd 或任何 .winmd in 中定义的类型C:\windows\system32\WinMetadata,注册表会将您指向实际的实现。

查找类型的名称,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\SystemSettings.DataModel.SettingsDatabaseDllPath值将包含实现该类型的 DLL。

于 2014-08-22T21:08:28.430 回答
3

你不能。.winmd 文件只包含类型声明,不包含任何代码。它与 COM 自动化中使用的类型库 (.tlb) 完全等效。C 或 C++ 程序中的 .h 文件的逻辑等效项。

.tlb 格式限制太多,无法支持 WinRT,因此被重新设计为 .winmd,文件格式与 .NET 元数据相同,您可以使用 .NET 工具(如 ildasm.exe)查看其内容。编译器使用它来知道如何生成正确的代码以使用 WinRT 组件,就像 C++ 编译器通过#include 包含类声明的 .h 文件知道如何使用类库一样。

就像 .h 文件一样,由您决定哪些可执行文件实现了这些类型并将其部署到用户的机器上。除非它是声明所有内置 WinRT 类型的 Windows.winmd,否则您会期望二进制组件非常接近 .winmd 文件。Store 要求您在包中包含该二进制组件。如果需要帮助,请向组件的作者寻求帮助。

于 2014-03-12T09:24:35.527 回答
1

汉斯非常到位。winmd 文件仅描述类型的形状(用于运行时的 CLR 和 JS 语言投影以及编译时的 C++ 编译器)。在运行时,RoActivateInstance API(或 RoGetActivationFactory API)采用类型名称并返回实现该类型的对象。

对于应用特定类型,包清单的ActivatableClassId条目描述了运行时类的实现位置。对于系统特定类型,它位于注册表中,但该类型的位置可能会在将来随时更改。

于 2014-03-13T04:36:47.367 回答