此DLL是托管还是非托管?

Cha*_*les 18 .net dll assemblies unmanaged managed

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

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

Dav*_*dRR 21

为了确定一个DLL(或EXE)是否被托管或非托管,使用dumpbin.exe与所述/dependents开关.如果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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

要么

dumpbin /dependents EXE_OF_INTEREST.EXE
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用corflags.exeVisual Studio Tools附带的实用程序.在非托管程序集上从Visual Studio命令提示符运行它:

corflags UNMANAGED.DLL
Run Code Online (Sandbox Code Playgroud)

..你会得到:

corflags : error CF008 : The specified file does not have a valid managed header
Run Code Online (Sandbox Code Playgroud)

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

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 1
ILONLY    : 1
32BIT     : 0
Signed    : 0
Run Code Online (Sandbox Code Playgroud)

有关:


Fyo*_*kin 6

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


Ree*_*sey 5

您可以检查PE头信息,以获取有关DLL中包含的信息类型的信息.该文章介绍了如何在细节做到这一点.

  • 所有有用的信息都应包含在此帖子中,而不仅仅是链接,链接现在已失效;) (4认同)