Как определить, был ли блок.NET создан для x86 или x64?

312
задан Peter Mortensen 28 June 2015 в 03:32
поделиться

3 ответа

Взгляд System.Reflection.AssemblyName.GetAssemblyName(string assemblyFile)

можно исследовать метаданные блока от возвращенного экземпляра AssemblyName:

Используя [1 114] 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 определяет целевую платформу.

  • Amd64: 64-разрядный процессор на основе x64 архитектуры.
  • Рука : процессор ARM.
  • IA64: 64-разрядный процессор Intel Itanium только.
  • MSIL: Нейтральный относительно процессора и битов на слово.
  • X86: 32-разрядный процессор Intel, или собственный компонент или в Windows на среде Windows на 64-разрядной платформе (WOW64).
  • Ни один : неизвестная или неуказанная комбинация процессора и битов на слово.

я использую PowerShell в этом примере для вызова метода.

268
ответ дан x0n 23 November 2019 в 01:10
поделиться

Можно использовать инструмент CorFlags CLI (например, C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\CorFlags.exe) для определения состояния блока, на основе его вывода и открытия блока как двоичный актив необходимо быть в состоянии определить, где необходимо стремиться определить, установлен ли флаг 32BIT на 1 ( x86) или 0 ( Какой-либо ЦП или x64, в зависимости от PE):

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

сообщение в блоге x64 Разработка с.NET имеет некоторую информацию [приблизительно 112].

Еще лучше, Вы можете использование Module.GetPEKind , чтобы определить, является ли блок PortableExecutableKinds значение PE32Plus (64-разрядным), Required32Bit (32-разрядный и WOW), или ILOnly (какой-либо ЦП) наряду с другими атрибутами.

219
ответ дан Peter Mortensen 23 November 2019 в 01:10
поделиться

Just for clarification, CorFlags.exe is part of the .NET Framework SDK. I have the development tools on my machine, and the simplest way for me determine whether a DLL is 32-bit only is to:

  1. Open the Visual Studio Command Prompt (In Windows: menu Start/Programs/Microsoft Visual Studio/Visual Studio Tools/Visual Studio 2008 Command Prompt)

  2. CD to the directory containing the DLL in question

  3. Run corflags like this: corflags MyAssembly.dll

You will get output something like this:

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

As per comments the flags above are to be read as following:

  • Any CPU: PE = PE32 and 32BIT = 0
  • x86: PE = PE32 and 32BIT = 1
  • 64-bit: PE = PE32+ and 32BIT = 0
138
ответ дан 23 November 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: