【问题标题】:Detect whether the assembly was built for .NET Compact Framework检测程序集是否是为 .NET Compact Framework 构建的
【发布时间】:2010-12-21 11:44:43
【问题描述】:

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

【问题讨论】:

  • 设备的桌面从哪里来?你的意思是来自代码,还是来自 Reflector 之类的工具?
  • 来自桌面,来自代码。

标签: .net reflection compact-framework assemblies mono.cecil


【解决方案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。

查看here了解更多详情。

希望这会有所帮助, 最好的祝福, 汤姆。

【讨论】:

  • 我检查了两个为 CF 构建的 .NET 库,它们的机器 ID 都设置为 0x014C (IMAGE_FILE_MACHINE_I386)。我想这是因为 .NET 文件并不是真正特定于设备的——当它们可以透明地支持 MIPS/SH3/x86/etc 时,写“ARM”是没有意义的。
  • @Andrey Shchekin:这很有趣,因为 VS Pro 似乎会创建一个针对 CF (arm/mips/sh3) 的 exe,然后将机器 ID 设置为 386..这会是一个错误我想知道?感谢您的有趣回复,这让我感到惊讶,因为我认为这不会发生! :)
  • 我不认为这是一个错误,因为 .NET CF exe 文件只要不使用特定于设备的 API 就可以在 x86/x64 上运行。
【解决方案2】:

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

http://ccimetadata.codeplex.com/

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

【讨论】:

【解决方案3】:

很简单:

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 的了解,我认为他们是,所以我会使用它。
  • 它们都是一样的。我们在控件设计器的代码中使用了类似的技术。如果我们针对完整的框架密钥进行创建,我们就知道我们处于设计阶段(或者无论如何都是在桌面上创建的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 2013-02-20
  • 2022-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多