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