Как сообщить, собрана ли сборка .NET как x86, x64 или любой CPU

Какой самый простой способ обнаружить (без доступа к исходному проекту), была ли сборка сборника .NET собрана как "x86", "x64" или "Любой процессор"?

Обновление. Утилита командной строки была достаточной для удовлетворения моих неотложных потребностей, но только ради полноты, если кто-то хочет сказать мне, как это сделать программно, тогда это тоже будет интересно, я уверен.

Ответ 1

Если вы просто хотите найти это в данной DLL, вы можете использовать инструмент GetPEKind метод Module класс:

Assembly assembly = Assembly.LoadFrom("path to dll");
PortableExecutableKinds peKind;
ImageFileMachine imageFileMachine;
assembly.ManifestModule.GetPEKind(out peKind, out imageFileMachine)

Затем вам нужно проверить peKind, чтобы проверить его значение. Для получения дополнительной информации см. документы MSDN для PortableExecutableKinds.

Ответ 2

Спасибо Адриану! Я переписал фрагмент в PowerShell, чтобы использовать его на сервере.

#USAGE #1
# Get-Bitness (dir *.dll | select -first 1)
#USAGE #2
# Get-Bitness "C:\vs\projects\bestprojectever\bin\debug\mysweetproj.dll"
function Get-Bitness([System.IO.FileInfo]$assemblyFile)
{
    $peKinds = new-object Reflection.PortableExecutableKinds
    $imageFileMachine = new-object Reflection.ImageFileMachine
    $a = [Reflection.Assembly]::LoadFile($assemblyFile.Fullname)
    $a.ManifestModule.GetPEKind([ref]$peKinds, [ref]$imageFileMachine)

    return $peKinds
}

Ответ 3

С# фрагмент, основанный на ответах Powershell:

var modules = assembly.GetModules();
var kinds = new List<PortableExecutableKinds>();
var images = new List<ImageFileMachine>();
foreach (var module in modules)
{
    PortableExecutableKinds peKinds;
    ImageFileMachine imageFileMachine;
    module.GetPEKind(out peKinds, out imageFileMachine);

    kinds.Add(peKinds);
    images.Add(imageFileMachine);
}

var distinctKinds = kinds.Distinct().ToList();
var distinctImages = images.Distinct().ToList();

Ответ 4

Спасибо Адриану и Питеру! Здесь приведена модифицированная версия Peter Get-Bitness: 1) принимает список файлов для проверки из конвейера и 2) не умирает, если смотрит на не-NET DLL (например, если он смотрит на некоторые С++ DLL)

# example usage: dir *.exe,*.dll | Get-PEKind
function Get-PEKind {
    Param(
      [Parameter(Mandatory=$True,ValueFromPipeline=$True)]
      [System.IO.FileInfo]$assemblies
    )

    Process {
        foreach ($assembly in $assemblies) {
            $peKinds = new-object Reflection.PortableExecutableKinds
            $imageFileMachine = new-object Reflection.ImageFileMachine
            try
            {
                $a = [Reflection.Assembly]::LoadFile($assembly.Fullname)
                $a.ManifestModule.GetPEKind([ref]$peKinds, [ref]$imageFileMachine)
            }
            catch [System.BadImageFormatException]
            {
                $peKinds = [System.Reflection.PortableExecutableKinds]"NotAPortableExecutableImage"
            }

            $o = New-Object System.Object
            $o | Add-Member -type NoteProperty -name File -value $assembly
            $o | Add-Member -type NoteProperty -name PEKind -value $peKinds
            Write-Output $o
        }
    }
}

Я новичок в PowerShell, поэтому это не может быть примером лучших практик.

В качестве альтернативы, в соответствии с fooobar.com/info/18064/... может также быть удобный командлет Get-PEHeader в Расширения сообщества PowerShell.