【发布时间】:2010-12-21 11:44:43
【问题描述】:
拥有一个 .NET 程序集,我如何检测它是为 .NET CF 还是为完整框架构建的?
【问题讨论】:
-
设备的桌面从哪里来?你的意思是来自代码,还是来自 Reflector 之类的工具?
-
来自桌面,来自代码。
标签: .net reflection compact-framework assemblies mono.cecil
拥有一个 .NET 程序集,我如何检测它是为 .NET CF 还是为完整框架构建的?
【问题讨论】:
标签: .net reflection compact-framework assemblies mono.cecil
最好的办法是获取 C 的包含文件头 winnt.h,在您的标准 VS Professional(通常是 C:\Program Files\Microsoft Visual Studio 9.0\VC\include)中找到,然后从那里加载 . EXE 到某种 PE Dumper 中,或使用 Hex Dumper。 1. 从偏移量 0x0 查看 DOS HEader。 2. NT 头将紧跟在 DOS 头之后。 3. 机器 ID 就是您要查找的内容。 CF (ARM/MIPS) 的机器 ID 分别为 0x010C/0x0169。如果您想花更多时间在四处闲逛……请继续阅读, 4. 然后你有紧跟在 NT Header 之后的 Data 目录。它是第 15 个数据目录条目,指示 .EXE 是否为 .NET。如果为 0,则为原生 .EXE。
结合在一起,您可以判断可执行文件是否为 .NET 和 CF。
查看here了解更多详情。
希望这会有所帮助, 最好的祝福, 汤姆。
【讨论】:
我宁愿使用 CCI 或 Cecil 来解析它的元数据并检查它依赖于哪一组引用。
【讨论】:
很简单:
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;
}
}
【讨论】: