3

拥有一个 .NET 程序集,我如何检测它是为 .NET CF 还是为完整框架构建的?

4

3 回答 3

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;
    }
}
于 2009-11-30T14:20:28.607 回答
1

我宁愿使用 CCI 或 Cecil 来解析它的元数据并检查它依赖于哪一组引用。

http://ccimetadata.codeplex.com/

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

于 2009-11-30T09:20:43.680 回答
1

最好的办法是获取 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。

在这里查看更多详细信息。

希望这会有所帮助,最好的问候,汤姆。

于 2009-11-30T00:05:28.183 回答