有了.NET程序集,我該如何檢測它是爲.NET CF還是完整框架構建的?檢測程序集是否爲.NET Compact Framework構建
回答
這很簡單:
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;
}
}
感謝。我想過這個解決方案,但我擔心所有版本的CF的公鑰是否相同。但知道你對CF的知識,我認爲他們是,所以我會用這個。 – 2009-11-30 20:15:13
他們都一樣。我們在控制設計師的代碼中使用類似的技術。如果我們是在完整的框架關鍵字上創建的,我們知道我們正處於設計階段(或者在桌面上創建)。 – ctacke 2009-11-30 20:46:09
最好的辦法是抓住標準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瞭解更多詳情。
希望這會有所幫助, 最好的問候, 湯姆。
我檢查了兩個爲CF構建的.NET庫,並且都將機器ID設置爲0x014C(IMAGE_FILE_MACHINE_I386)。我想這是因爲.NET文件並不是特定於設備的 - 當他們可以透明地支持MIPS/SH3/x86 /等時,沒有必要寫'ARM'。 – 2009-11-30 01:01:12
@Andrey Shchekin:這很有趣,因爲看起來VS Pro會創建一個針對CF(arm/mips/sh3)的EXE,並將機器ID添加到386上。這是我想知道的一個bug嗎?感謝有趣的答覆,這讓我感到驚訝,因爲我不認爲會發生! :) – t0mm13b 2009-11-30 01:38:26
我不認爲這是一個錯誤,因爲只要不使用特定於設備的API,.NET CF exe文件就可以在x86/x64上運行。 – 2009-11-30 08:03:24
我寧願使用CCI或Cecil解析它的元數據,並檢查它依賴於哪一組引用。
爲了某個目的,我的問題上有mono.cecil標記。 :)但是我應該尋找什麼?程序集我已經看過參考mscorlib和System.dll。我應該檢查一些特定的版本號嗎? .NET和.NET CF有明確區別嗎? – 2009-11-30 10:10:21
版本號可以是一個顯著指示, http://en.wikipedia.org/wiki/.NET_Compact_Framework http://en.wikipedia.org/wiki/.NET_Framework – 2009-12-01 01:56:26
- 1. 如何爲.NET Compact Framework構建FParsec?
- 2. .NET Compact Framework缺少程序集?
- 3. .NET Compact Framework - 檢測是否在仿真器下?
- 4. 爲什麼部署.NET Compact Framework程序集會導致部署.NET Desktop Framework程序集?
- 5. .NET Compact Framework應用程序是否與Windows Phone 7兼容?
- 6. .NET Compact Framework
- 7. .net compact framework deserialization
- 8. .net Compact Framework 4.0
- 9. .Net Compact Framework 2.0:部署應用程序
- 10. 從.NET程序集(Compact Framework 3.5/VS2008)中缺少版本信息
- 11. 如何區分Compact Framework與完整框架.NET程序集
- 12. .NET Compact Framework和ActiveSync
- 13. .NET Compact Framework的XSockets
- 14. ProcessStartInfo.RedirectOutput on .net compact framework
- 15. 將.Net Compact Framework 3.5轉換爲.Net Core
- 16. System.Data.SQLite是否支持Compact Framework?
- 17. .NET Compact Framework應用程序安裝創建器
- 18. 驗證.NET Framework程序集
- 19. .Net Framework 4.0安裝程序是否包含.Net Framework 3.5?
- 20. .net framework 3.0引導程序是否包含.net framework 2.0?
- 21. Windows Mobile 6 - .net Socket建議[Compact Framework 3.5]
- 22. Rhino Mocks&Compact Framework
- 23. c#Compact Framework檢測連接已關閉
- 24. Nant構建問題:無法初始化Microsoft .NET Compact Framework
- 25. 什麼是AGL在.NET Compact Framework的
- 26. 將Xaml UI轉換爲.Net Compact Framework UI
- 27. XAML和Windows Mobile(.Net Compact Framework)
- 28. .Net Compact Framework&WinCE問題
- 29. .NET Compact Framework SDK下載
- 30. 更新.NET Compact Framework - 何時?
從設備的地方,桌面?你的意思是來自代碼,還是來自像Reflector這樣的工具? – ctacke 2009-11-30 00:28:30
從桌面,從代碼。 – 2009-11-30 00:54:21