【问题标题】:How can I detect the type of a dll? (COM, .NET, WIN32)如何检测 dll 的类型? (COM、.NET、WIN32)
【发布时间】:2010-11-28 02:08:30
【问题描述】:

我需要处理文件夹中的多个 dll 和 exe 文件,并确定我正在处理的文件类型:.NET、COM、Win32 或其他一些外星生命形式。

我一直在尝试确定检测 DLL 类型的最简单方法,您对此有何看法:

  1. COM dll => 我做了一个 LoadLibrary,然后 GetProcAddress 用于“DllRegisterServer”。如果我得到一个有效的回报,那就是一个 COM 文件。

  2. .NET dll => 如果 dll 依赖于 MSCOREE.DLL 它总是一个 .NET dll?

  3. Win32 dll => 如果上述两个测试都失败了,那是 Win32 dll 吗?

肯定有更好的方法来检测我们正在处理的 dll 类型。以上内容非常笨重,不适用于EXE文件?一定有其他我没有想到的方法。

理想情况下,我希望能够让解析器确定文件是用什么编译器编译的,以及它使用了哪些功能,例如 MFC、Atl、Stl 等……但我怀疑这在预反思中是可能的时代?

【问题讨论】:

    标签: .net com dll file


    【解决方案1】:

    您必须检查这些文件的 PE Header。所有 DLL 和可执行文件,Win32 和 .NET,都有一个 PE 头。

    An In-Depth Look into the Win32 Portable Executable File Format

    The .NET File Format

    Portable Executable

    【讨论】:

    • 由于不错的链接而接受此答案。感谢其他海报提供宝贵的 cmets。
    【解决方案2】:

    DllRegisterServer 不是必需的,COM dll 唯一需要的导出是 DllGetClassObject

    【讨论】:

      【解决方案3】:

      我没有看到更好的方法。然而,在 2.,实际上答案是否定的。运行时主机几乎肯定也依赖于 mscoree.dll,而这些不一定是 .Net 程序集。

      .Net dll 有一个 COM 描述符,您可以使用 dumpbin 找到它。我不知道如何从代码中获取这些信息。

      如果您在 .Net 中编程,确定程序集是否为 .Net 程序集的一种方法是尝试调用 Assembly.LoadFrom(...)。

      嗯,这不是一个真正的答案,而是我会研究的一组提示。

      【讨论】:

      • 嗨,谢谢。我以前使用过“尝试加载程序集”的方法 - 但它看起来非常笨重,不是吗?听起来我需要走 PE 路线。可能是一个很好的可重用组件。我希望库中有一个隐藏的功能可以做到这一点,但猜不到。
      • 是的,它看起来确实非常笨重...... yyucckckk! :-) 祝你好运!
      猜你喜欢
      • 1970-01-01
      • 2015-12-25
      • 2010-11-08
      • 1970-01-01
      • 2014-08-25
      • 2018-09-13
      • 1970-01-01
      • 2011-12-29
      相关资源
      最近更新 更多