我在你之前握住一个DLL。只使用Win32 SDK,你能告诉我这个DLL是不是.NET程序集?此DLL是管理还是非托管?
为什么?我们的应用程序以DLL的形式加载插件。我们试图扩展这些插件的定义以允许使用.NET程序集,但是接口会有所不同,因此加载器在加载之前需要知道该DLL是否被管理或不受管理。
我在你之前握住一个DLL。只使用Win32 SDK,你能告诉我这个DLL是不是.NET程序集?此DLL是管理还是非托管?
为什么?我们的应用程序以DLL的形式加载插件。我们试图扩展这些插件的定义以允许使用.NET程序集,但是接口会有所不同,因此加载器在加载之前需要知道该DLL是否被管理或不受管理。
您可以检查PE头信息,以获取有关DLL中包含的信息类型的信息。这article describes how to accomplish this in detail。
我只是试图加载它作为一个.NET程序集,如果它失败,回退到“非托管”的界面。
加载托管程序集时不会加载类似缺失依赖的错误会导致插件加载程序不必要地回退到非托管模式? – Harindaka 2011-10-21 03:05:09
@Harindaka:我想会的,那又如何?未加管理的加载程序也将失败,这将是故事的结尾。你看到了什么问题? – 2011-10-24 04:09:58
要确定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
相关:
您可以要求插件创建者包含特殊资源。 – 2011-03-12 20:30:25