2008-12-01 90 views

回答

6

也許這有助於

http://www.grimes.nildram.co.uk/dotnet/vistaAndDotnet.htm

接下來,我檢查,看它是否是一個.NET程序集。爲此,我檢查文件是否包含CLR標題。該頭文件包含有關.NET代碼在文件中的位置以及用於編寫該代碼的框架版本的重要信息。該頭的位置在文件的數據目錄表中給出。如果數據目錄項具有零值,那麼該文件是非託管的,如果它具有非零值,則該文件是.NET程序集。

您可以使用dumpbin實用程序和/ headers開關自己測試它。該實用程序將在命令行上的文件中打印各種標題。在可選標題值的末尾,您將看到數據目錄列表(總是有16個),並且如果COM描述符目錄具有非零位置,則表明該文件是.NET程序集。 CLR頭文件的內容也可以使用/ clrheader開關列出(如果文件是非託管的,則不會顯示任何值)。 XP在執行文件時測試CLR頭文件,如果CLR頭文件存在,它將初始化運行時並將程序集的入口點傳遞給運行時,以使文件完全在運行時運行。

+0

這很有幫助,但我正在尋找一個程序化檢查。 – 2008-12-01 18:27:04

+0

你有另一個鏈接? (當前鏈接已死) – Fab 2015-11-09 20:45:10

1

第一個鏈接將是最快和最簡單的檢查方法(PE文件頭一個)。假設調用Assembly.ReflectionOnlyLoad會很慢,你是正確的。

5

在過去,我使用了AssemblyName.GetAssemblyName(),如果它不是託管程序集,則會引發異常。但是,我從來沒有進行過性能測試,所以我不能說它有多快。

7

我想Stormenet的答案在技術上並不是編程,所以我會把我的回答分解成一個答案。

爲了獲得最佳性能,沒有什麼打算通過StreamReader打開文件,讀取第一個(n)個字節並檢查字節流中的.NET文件簽名數據結構。

差不多你驗證一番同樣的方式是一個DOS可執行文件:

http://en.wikipedia.org/wiki/DOS_executable

尋找「MZ」頭字節,這也恰好是馬克·茨柏克沃斯基的縮寫,一個MS-DOS的開發人員......

相關問題