检测程序集是否是为.NET Compact Framework构建的
-
08-07-2019 - |
题
使用.NET程序集,如何检测它是为.NET CF还是完整框架构建的?
解决方案
这很简单:
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;
}
}
其他提示
最好的办法是获取名为winnt.h的C包含文件头,该头文件位于您的标准VS专业版(通常为C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include)中,然后从中加载。 EXE进入某种PE翻斗车,或使用Hex Dumper。 1.从偏移量0x0查看DOS头。 在DOS标题之后,NT标题会立即跟随。 3.机器ID是您正在寻找的。 CF(ARM / MIPS)的机器ID分别为0x010C / 0x0169。如果你想投入更多时间在四处寻找..继续阅读, 4.然后在NT Header之后紧跟着Data目录。它是第15个数据目录条目,表示.EXE是否为.NET。如果它是0,那么它是本机.EXE。
结合在一起,您可以判断可执行文件是.NET还是CF.
查看此处了解更多详情。
希望这有帮助, 最好的祝福, 汤姆。
我宁愿使用CCI或Cecil来解析其元数据并检查它所依赖的引用集。
不隶属于 StackOverflow