2009-11-29 37 views

回答

2

這很簡單:

public enum AssemblyType 
{ 
    CompactFramework, 
    FullFramework, 
    NativeBinary 
} 

public AssemblyType GetAssemblyType(string pathToAssembly) 
{ 
    try 
    { 
     Assembly asm = Assembly.LoadFrom(pathToAssembly); 
     var mscorlib = asm.GetReferencedAssemblies().FirstOrDefault(a => string.Compare(a.Name, "mscorlib", true) == 0); 
     ulong token = BitConverter.ToUInt64(mscorlib.GetPublicKeyToken(), 0); 

     switch (token) 
     { 
      case 0xac22333d05b89d96: 
       return AssemblyType.CompactFramework; 
      case 0x89e03419565c7ab7: 
       return AssemblyType.FullFramework; 
      default: 
       throw new NotSupportedException(); 
     } 
    } 
    catch (BadImageFormatException) 
    { 
     return AssemblyType.NativeBinary; 
    } 
} 
+0

感謝。我想過這個解決方案,但我擔心所有版本的CF的公鑰是否相同。但知道你對CF的知識,我認爲他們是,所以我會用這個。 – 2009-11-30 20:15:13

+0

他們都一樣。我們在控制設計師的代碼中使用類似的技術。如果我們是在完整的框架關鍵字上創建的,我們知道我們正處於設計階段(或者在桌面上創建)。 – ctacke 2009-11-30 20:46:09

1

最好的辦法是抓住標準VS Professional(通常是C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include)中找到的名爲winnt.h的C頭文件頭,然後加載.EXE插入某種PE傾卸器,或使用Hex Dumper。 1.查看偏移量爲0x0的DOS頭文件。 2. NT標題將緊跟在DOS標題之後。 3.機器ID是你正在尋找的。 CF(ARM/MIPS)的機器ID分別爲0x010C/0x0169。如果你想投入更多的時間在周圍徘徊..繼續閱讀, 4.然後你在NT Header之後緊跟着Data目錄。它是第15個數據目錄條目是.EXE是否爲.NET的指示。如果它是0,那麼它是一個本地.EXE。

結合在一起,你就可以知道可執行文件是.NET還是CF文件。

查看here瞭解更多詳情。

希望這會有所幫助, 最好的問候, 湯姆。

+0

我檢查了兩個爲CF構建的.NET庫,並且都將機器ID設置爲0x014C(IMAGE_FILE_MACHINE_I386)。我想這是因爲.NET文件並不是特定於設備的 - 當他們可以透明地支持MIPS/SH3/x86 /等時,沒有必要寫'ARM'。 – 2009-11-30 01:01:12

+0

@Andrey Shchekin:這很有趣,因爲看起來VS Pro會創建一個針對CF(arm/mips/sh3)的EXE,並將機器ID添加到386上。這是我想知道的一個bug嗎?感謝有趣的答覆,這讓我感到驚訝,因爲我不認爲會發生! :) – t0mm13b 2009-11-30 01:38:26

+0

我不認爲這是一個錯誤,因爲只要不使用特定於設備的API,.NET CF exe文件就可以在x86/x64上運行。 – 2009-11-30 08:03:24

1

我寧願使用CCI或Cecil解析它的元數據,並檢查它依賴於哪一組引用。

http://ccimetadata.codeplex.com/

http://www.mono-project.com/Cecil

+0

爲了某個目的,我的問題上有mono.cecil標記。 :)但是我應該尋找什麼?程序集我已經看過參考mscorlib和System.dll。我應該檢查一些特定的版本號嗎? .NET和.NET CF有明確區別嗎? – 2009-11-30 10:10:21

+0

版本號可以是一個顯著指示, http://en.wikipedia.org/wiki/.NET_Compact_Framework http://en.wikipedia.org/wiki/.NET_Framework – 2009-12-01 01:56:26

相關問題