2011-03-11 111 views
12

我在你之前握住一个DLL。只使用Win32 SDK,你能告诉我这个DLL是不是.NET程序集?此DLL是管理还是非托管?

为什么?我们的应用程序以DLL的形式加载插件。我们试图扩展这些插件的定义以允许使用.NET程序集,但是接口会有所不同,因此加载器在加载之前需要知道该DLL是否被管理或不受管理。

+0

您可以要求插件创建者包含特殊资源。 – 2011-03-12 20:30:25

回答

7

我只是试图加载它作为一个.NET程序集,如果它失败,回退到“非托管”的界面。

+0

加载托管程序集时不会加载类似缺失依赖的错误会导致插件加载程序不必要地回退到非托管模式? – Harindaka 2011-10-21 03:05:09

+0

@Harindaka:我想会的,那又如何?未加管理的加载程序也将失败,这将是故事的结尾。你看到了什么问题? – 2011-10-24 04:09:58

11

要确定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命令提示符:

微软的Visual Studio 2010 =>Visual Studio工具 =>Visual Studio命令提示符(2010)

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

dumpbin /dependents DLL_OF_INTEREST.DLL 

dumpbin /dependents EXE_OF_INTEREST.EXE 

作为替代,可以使用corflags.exe实用工具,还包括与Visual Studio工具。从Visual Studio命令提示符下运行其上的非托管组件:

corflags UNMANAGED.DLL 

..you'll得到:

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 

相关: