我给你展示一个DLL文件。只使用Win32 SDK,您能否告诉我这个DLL是否是.NET程序集?
为什么要这么做呢?我们的应用程序以DLL形式加载插件。我们正在尝试扩展这些插件的定义,以允许使用.NET程序集,但接口将不同,因此加载器需要在加载前知道这个DLL是托管的还是非托管的。
我给你展示一个DLL文件。只使用Win32 SDK,您能否告诉我这个DLL是否是.NET程序集?
为什么要这么做呢?我们的应用程序以DLL形式加载插件。我们正在尝试扩展这些插件的定义,以允许使用.NET程序集,但接口将不同,因此加载器需要在加载前知道这个DLL是托管的还是非托管的。
要确定一个 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我会尝试将它作为.NET程序集加载,如果失败,则退而求其次使用“非托管”接口。
您可以检查PE头信息,以获取有关DLL中包含哪些类型信息的信息。此文章详细描述了如何实现此操作。