2011-03-11 136 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 

相關: