我在你之前握住一個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