此DLL是托管还是非托管?

时间:2011-03-11 17:06:28

标签: .net dll assemblies unmanaged managed

我在你面前拿着一个DLL。只使用Win32 SDK,你能告诉我这个DLL是否是一个.NET程序集吗?

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

3 个答案:

答案 0 :(得分:18)

确定DLL(或EXE)是受管理还是非受管,use dumpbin.exe with the /dependents switch。如果看到mscoree.dll in the output,那么程序集就是一个托管程序集。

例如,对于我在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 =&gt; Visual Studio工具 =&gt; Visual Studio命令提示符(2010)

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

dumpbin /dependents DLL_OF_INTEREST.DLL

<强>

dumpbin /dependents EXE_OF_INTEREST.EXE

作为替代方案,您可以使用Visual Studio Tools附带的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

相关:

答案 1 :(得分:6)

我只是尝试将其作为.NET程序集加载,如果失败,则回退到“非托管”界面。

答案 2 :(得分:5)

您可以检查PE头信息,以获取有关DLL中包含的信息类型的信息。这article describes how to accomplish this in detail