【问题标题】:Given a .winmd file, where can we find the real implementation DLL?给定一个 .winmd 文件,我们在哪里可以找到真正的实现 DLL?
【发布时间】:2014-03-12 07:41:20
【问题描述】:

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

【问题讨论】:

  • 为什么需要知道问题的答案?是闲散的好奇心还是您对答案有技术需求?

标签: .net windows-runtime winmd


【解决方案1】:

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

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

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

【讨论】:

  • 这个答案要么需要官方文档的链接,要么需要一个免责声明,它描述了未记录的实现细节(可以随时更改,恕不另行通知)。
  • 好吧,对不起,没有免责声明,这个答案很危险。 -1,恐怕,尤其是在 supported API 出现的情况下,并且比您早了将近半年的 published in an answer。很遗憾,因为您声称为必须使用未记录的接口修复应用程序的公司工作。
  • 我的回答补充了之前的回答。添加免责声明很有意义,谢谢!
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢汉斯。但是加载器如何知道真正的实现代码在哪里呢?回到原生世界,.dll 的 .lib 只包含类似“jmp _imp_xxx”的指令,loader 加载 .DLL 并更改基地址以确保控制流可以跳转到实际代码,这与 .winmd 非常相似:如果我的代码调用驻留在 .winmd 中的函数,加载程序或操作系统的某些组件应该将控制流重定向到真实代码,对吗?他们如何找到真正的装配体?
  • 大问题。它与无注册 COM 的工作方式非常相似。绑定在运行时动态发生,不涉及加载程序。 RoCreateInstance() 是工厂函数,相当于注册表就是包清单。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2011-03-11
    • 2019-07-31
    • 1970-01-01
    • 2011-07-03
    相关资源
    最近更新 更多