我如何确定是否为x86或x64构建了.NET程序集?

问题描述 投票:325回答:14

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

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

.net assemblies x86 64-bit x86-64
14个回答
277
投票

System.Reflection.AssemblyName.GetAssemblyName(string assemblyFile)

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

使用PowerShell

[36] C:\> [reflection.assemblyname] :: GetAssemblyName(“ $ {pwd} \ Microsoft.GLEE.dll”)| FL名称:Microsoft.GLEE版本:1.0.0.0CultureInfo:代码库:file:/// C:/ projects / powershell / BuildAnalyzer / ...EscapedCodeBase:file:/// C:/ projects / powershell / BuildAnalyzer / ...ProcessorArchitecture:MSIL标志:公钥哈希算法:SHA1版本兼容性:SameMachine密钥对:FullName:Microsoft.GLEE,Version = 1.0.0.0,Culture = neut ...

这里,ProcessorArchitecture标识目标平台。

  • Amd64:基于x64架构的64位处理器。
  • Arm:一个ARM处理器。
  • IA64:仅64位Intel Itanium处理器。
  • MSIL:关于处理器和每字位数是中性的。
  • X86:32位Intel处理器,本机或在64位平台(WOW64)上的Windows on Windows环境中。
  • None:处理器和每个字的位数的未知或未指定的组合。

在此示例中,我使用PowerShell来调用该方法。


221
投票

您可以使用CorFlags CLI工具(例如C:\ Program Files \ Microsoft SDKs \ Windows \ v7.0 \ Bin \ CorFlags.exe)来根据程序集的输出确定程序集的状态并将打开的程序集作为二进制资产,您应该能够确定需要在哪里确定32BIT标志是设置为1(x86还是0(Any CPUx64]) >,取决于PE):

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

博客文章x64 Development with .NET

包含有关corflags的一些信息。

甚至更好,您可以use Module.GetPEKind来确定程序集是Module.GetPEKindPortableExecutableKinds(64位),PE32Plus(32位和WOW)还是Required32Bit(任何CPU)以及其他属性。


141
投票

仅作说明,CorFlags.exe是ILOnly的一部分。我的机器上有开发工具,确定DLL是否仅是32位的最简单方法是:


21
投票

你只写你自己的怎么样?自从Windows 95中实施以来,PE体系结构的核心并未发生重大变化。这是一个C#示例:


9
投票

尝试使用CorFlagsReader 0x10B - PE32 format. 0x20B - PE32+ format. 。它没有对其他程序集的引用,可以按原样使用。


7
投票

JetBrians的DotPeek提供了快速简便的方法来查看msil(anycpu),x86,x64from this project at CodePlex


6
投票
dotPeek

5
投票

下面是一个批处理文件,它将对当前工作目录和所有子目录中的所有[TestMethod] public void EnsureKWLLibrariesAreAll64Bit() { var assemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies().Where(x => x.FullName.StartsWith("YourCommonProjectName")).ToArray(); foreach (var assembly in assemblies) { var myAssemblyName = AssemblyName.GetAssemblyName(assembly.FullName.Split(',')[0] + ".dll"); Assert.AreEqual(ProcessorArchitecture.MSIL, myAssemblyName.ProcessorArchitecture); } } corflags.exe运行dlls,解析结果并显示每个目标的体系结构。


2
投票

另一种方法是在DLL上使用Visual Studio工具中的dumpbin并寻找适当的输出


2
投票

[更通用的方式-使用文件结构确定位数和图像类型:


2
投票

我克隆了一个超级方便的工具,该工具在Windows资源管理器中为程序集添加了一个上下文菜单项,以显示所有可用信息:


1
投票

检查.NET程序集目标平台的另一种方法是使用enter image description here检查程序集...


1
投票

cfeduke注意到可以调用GetPEKind。在PowerShell中执行此操作可能很有趣。


1
投票

您可以在此处找到更高级的应用程序:PowerShell Community Extensions

© www.soinside.com 2019 - 2024. All rights reserved.