如何确定.NET程序集是为x86还是x64构建的?

我有一个.NET程序集的任意列表。

我需要以编程方式检查每个DLL是否为x86构建(而不是x64或任何CPU)。 这可能吗?


看看System.Reflection.AssemblyName.GetAssemblyName(string assemblyFile)

您可以从返回的AssemblyName实例中检查程序集元数据:

使用PowerShell

[36] C:> [reflection.assemblyname]::GetAssemblyName("${pwd}Microsoft.GLEE.dll") | fl

Name                  : Microsoft.GLEE
Version               : 1.0.0.0
CultureInfo           :
CodeBase              : file:///C:/projects/powershell/BuildAnalyzer/...
EscapedCodeBase       : file:///C:/projects/powershell/BuildAnalyzer/...
ProcessorArchitecture : MSIL
Flags                 : PublicKey
HashAlgorithm         : SHA1
VersionCompatibility  : SameMachine
KeyPair               :
FullName              : Microsoft.GLEE, Version=1.0.0.0, Culture=neut... 

这里,ProcessorArchitecture标识目标平台。

我在本例中使用PowerShell来调用该方法。


您可以使用CorFlags CLI工具(例如,C: Program Files Microsoft SDKs Windows v7.0 Bin CorFlags.exe)来确定程序集的状态,并根据其输出结果打开程序集二元资产,您应该能够确定您需要查找的位置,以确定32BIT标志是设置为1(x86)还是0(取决于PE任何CPU或x64):

Option    | PE    | 32BIT
----------|-------|---------
x86       | PE32  | 1
Any CPU   | PE32  | 0
x64       | PE32+ | 0

使用.NET开发的博客帖子x64开发了一些关于corflags信息。

更好的是,您可以使用Module.GetPEKind来确定程序集是否为PortableExecutableKindsPE32Plus (64位), Required32Bit (32位和WOW)或ILOnly (任何CPU)以及其他属性。


为了澄清,CorFlags.exe是.NET Framework SDK的一部分。 我的机器上有开发工具,而确定一个DLL是否只有32位的最简单方法是:

  • 打开Visual Studio命令提示符(在Windows中:菜单开始/程序/ Microsoft Visual Studio / Visual Studio工具/ Visual Studio 2008命令提示符)

  • CD到包含有问题的DLL的目录

  • 像这样运行corflags: corflags MyAssembly.dll

  • 你会得到这样的输出:

        Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  3.5.21022.8
    Copyright (c) Microsoft Corporation.  All rights reserved.
    
    Version   : v2.0.50727
    CLR Header: 2.5
    PE        : PE32
    CorFlags  : 3
    ILONLY    : 1
    32BIT     : 1
    Signed    : 0
    

    根据评论意见,上述标志的内容如下:

  • 任何CPU:PE = PE32和32BIT = 0
  • x86:PE = PE32和32BIT = 1
  • 64位:PE = PE32 +和32BIT = 0
  • 链接地址: http://www.djcxy.com/p/37681.html

    上一篇: How to determine if a .NET assembly was built for x86 or x64?

    下一篇: Interface defining a constructor signature?