使用.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来解析其元数据并检查它所依赖的引用集。

http://ccimetadata.codeplex.com/

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top