检测程序集是否是为 .NET Compact Framework 构建的

发布于 2024-08-13 09:23:09 字数 45 浏览 5 评论 0原文

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

Having a .NET assembly, how can I detect whether it was built for .NET CF or a full framework?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

看轻我的陪伴 2024-08-20 09:23:09

这很简单:

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;
    }
}

It's quite simple:

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;
    }
}
没︽人懂的悲伤 2024-08-20 09:23:09

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

http://ccimetadata.codeplex.com/

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

I rather use CCI or Cecil to parse its metadata and check out which set of references it depends on.

http://ccimetadata.codeplex.com/

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

你与昨日 2024-08-20 09:23:09

最好的选择是获取名为 winnt.h 的 C 包含文件头,该文件位于标准 VS Professional 中(通常为 C:\Program Files\Microsoft Visual Studio 9.0\VC\include),然后从那里将 .EXE 加载到某种 PE 转储器,或使用六角转储器。

  1. 从偏移量 0x0 开始查看 DOS HEader。
  2. NT 标头紧跟在 DOS 标头之后。
  3. 机器 ID 就是您要查找的内容。 CF (ARM/MIPS) 的机器 ID 分别为 0x010C/0x0169。如果您想花更多的时间来研究……请继续阅读,
  4. 那么您将在 NT 标头之后看到 Data 目录。它是第 15 个数据目录条目,指示 .EXE 是否为 .NET。如果为 0,则它是本机 .EXE。

组合在一起,您就可以判断可执行文件是否为 .NET 且适用于 CF。

看看 此处了解更多详细信息。

希望这有帮助,
此致,
汤姆.

The best bet would be to grab the C's include file header called winnt.h, found in your standard VS Professional (usually C:\Program Files\Microsoft Visual Studio 9.0\VC\include) and from there, load the .EXE into a PE Dumper of some sort, or use a Hex Dumper.

  1. Look at the DOS HEader from offset 0x0.
  2. The NT Header would immediately follow after the DOS header.
  3. The Machine ID is what you are looking for. The machine ID for CF (ARM/MIPS) would be 0x010C/0x0169, respectively. If you wish to invest more time in poking around.. read on,
  4. Then you have the Data directory immediately following after NT Header. It is the 15th data directory entry is the indication of whether the .EXE is .NET or not. If it is 0, then it is a native .EXE.

Combined together you can then tell if the executable is .NET and for the CF.

Look here for more details.

Hope this helps,
Best regards,
Tom.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文