2009-10-19 8 views
30

Qual è il modo più semplice per scoprire (senza accesso al progetto di origine) se una DLL assembly .NET è stato compilato come 'X 86', '64' o 'Qualsiasi CPU'?Come sapere se un assembly .NET è stato compilato come x86, x64 o qualsiasi CPU

Aggiornamento: Un'utilità da riga di comando era sufficiente per soddisfare i miei bisogni immediati, ma solo per motivi di completezza, se qualcuno vuole dirmi come farlo a livello di codice, allora sarebbe interessante anche questo, sono sicuro .

+0

mi sento di raccomandare la ricerca attraverso l'ISA di per x86 e x64 e generare il set di istruzioni differenti tra i due. Poi cercherò i binari dll per quelle differenze e (si spera) che ti dia il risultato che desideri. Anche così sembra difficile, soggetto a errori, e non lo consiglierei. (Non so se la dll contiene questa informazione stessa) –

+0

Stai cercando uno strumento o come farlo da solo a livello di programmazione? – pbz

+0

Idealmente, fare clic destro/proprietà/dettagli, ma purtroppo :( –

risposta

45

Se si desidera solo per scoprire questo su un dato dll, quindi è possibile utilizzare lo strumento CorFlags che fa parte di Windows SDK:

CorFlags.exe assembly.dll 

Se si vuole farlo utilizzando il codice , dare un'occhiata al metodo della classe ModuleGetPEKind:

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

È quindi necessario esaminare la peKind per controllare il suo valore. Vedi lo MSDN docs per PortableExecutableKinds per maggiori informazioni.

+0

Grazie . ho corso 'CorFlags.exe' ma non capisco come leggere l'output Cosa farei vedere erano l'assembly x86/x64/AnyCPU –

+1

@ColonelPanic:.? Cercare la bandiera' 32BIT' Se si tratta di '1. . ', allora il gruppo è compilato per solo 32 bit – adrianbanks

+0

installo VS 2008, VS 2010 VS 2012 e VS 2013. ho 8 file CorFlags.exe in sottocartelle in C: \ Program files (x86) \ Microsoft SDK \ Windows \ Quale quale dovrei usare? – Kiquenet

13

Grazie Adrian! Ho riscritto lo snippet in PowerShell per poterlo utilizzare sul server.

#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 
} 
+0

Fantastico. Lo darei +2 se potessi – JMarsch

2

Grazie Adrian e Peter! Ecco una versione modificata di Get-Bitness di Peter che 1) prende una lista di file da esaminare dalla pipeline, e 2) non muore se guarda una DLL non-. NET (ad esempio se guarda certe DLL C++) :

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

sono nuovo di PowerShell, quindi questo non può essere un esempio di buone pratiche.

In alternativa, in base a https://stackoverflow.com/a/4719567/64257 potrebbe essere presente anche un pratico cmdlet Get-PEHeader nello PowerShell Community Extensions.

3

C# frammento, sulla base delle risposte 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(); 
Problemi correlati