这个DLL是托管的还是非托管的?

23

我给你展示一个DLL文件。只使用Win32 SDK,您能否告诉我这个DLL是否是.NET程序集?

为什么要这么做呢?我们的应用程序以DLL形式加载插件。我们正在尝试扩展这些插件的定义,以允许使用.NET程序集,但接口将不同,因此加载器需要在加载前知道这个DLL是托管的还是非托管的。


您可以向插件创建者提出包含特殊资源的请求。 - David Heffernan
3个回答

31

要确定一个 DLL(或 EXE)是托管的还是非托管的,请使用带有 /dependents 开关的 dumpbin.exe。如果在输出中看到 mscoree.dll,那么该程序集就是托管程序集。

例如,对于我在 Visual Studio 2010 中创建的托管 DLL,我会得到如下输出:

Dump of file <MANAGED_DLL>.dll

File Type: DLL

  Image has the following dependencies:

    mscoree.dll

  Summary

        2000 .reloc
        2000 .rsrc
        2000 .sdata
       12000 .text

dumpbin.exe是Visual Studio工具的一部分。要运行它,可以通过Visual Studio命令提示符方便地进行。例如,在我的运行Visual Studio 2010的Windows 7计算机上,我可以在Windows开始菜单中找到Visual Studio命令提示符:

Microsoft Visual Studio 2010 => Visual Studio工具 => Visual Studio命令提示符(2010)

然后,在Visual Studio命令提示符中只需输入:

dumpbin /dependents DLL_OF_INTEREST.DLL

或者

dumpbin /dependents EXE_OF_INTEREST.EXE

作为另一种选择,您可以使用Visual Studio工具中也包含的corflags.exe实用程序。在Visual Studio命令提示符上运行它来处理一个非托管程序集:

corflags UNMANAGED.DLL

你将会得到:

corflags : error CF008 : The specified file does not have a valid managed header

...而在托管程序集上,你会得到类似于:

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 1
ILONLY    : 1
32BIT     : 0
Signed    : 0

相关:


对于找不到 dumpbin.exe 的任何人来说,它作为 MSVC C++ 构建工具的一部分包含在内(例如 MSVC v142 - VS 2019 C++ x64/x86 build tools)。 - encryptedcurse

6

我会尝试将它作为.NET程序集加载,如果失败,则退而求其次使用“非托管”接口。


如果加载托管程序集时出现缺少依赖项等无法加载的错误,是否会导致插件加载器不必要地回退到非托管模式呢? - Harindaka
@Harindaka:我猜它会失败,那又怎样?非托管的加载器也会失败,这将是故事的结束。您对此有什么问题吗? - Fyodor Soikin

4

9
这篇文章应该包含所有有用的信息,而不仅仅是链接,因为链接已经失效了 ;) - DrCopyPaste
@DrCopyPaste https://web.archive.org/web/20160202125049/http://blogs.msdn.com/b/kstanton/archive/2004/03/31/105060.aspx - jaybro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接