proyecto - Cómo saber si un ensamblado.NET se compiló como x86, x64 o cualquier CPU
regasm framework (4)
C # snippet, basado en las respuestas de 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();
¿Cuál es la forma más fácil de descubrir (sin acceso al proyecto de origen) si una DLL de conjunto .NET se compiló como ''x86'', ''x64'' o ''Cualquier CPU''?
Actualización: una utilidad de línea de comandos fue suficiente para satisfacer mis necesidades inmediatas, pero solo para completar, si alguien quiere decirme cómo hacerlo programáticamente, eso también sería de interés, estoy seguro.
Gracias Adrian y Peter! Aquí hay una versión modificada de Peter''s Get-Bitness que 1) toma una lista de archivos para examinar desde la canalización, y 2) no se apaga si mira una DLL que no es .NET (por ejemplo, si mira ciertos archivos C ++ 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
}
}
}
Soy nuevo en PowerShell, por lo que este puede no ser un ejemplo de las mejores prácticas.
Alternativamente, de acuerdo con https://.com/a/4719567/64257 también puede haber un cmdlet Get-PEHeader útil en las extensiones de comunidad de PowerShell .
Gracias Adrian! He reescrito el fragmento en PowerShell para poder usarlo en el servidor.
#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
}
Si solo desea descubrir esto en un dll determinado, puede usar la herramienta CorFlags que forma parte del SDK de Windows:
CorFlags.exe assembly.dll
Si quiere hacerlo usando el código, eche un vistazo al método GetPEKind de la clase Module :
Assembly assembly = Assembly.LoadFrom("path to dll");
PortableExecutableKinds peKind;
ImageFileMachine imageFileMachine;
assembly.ManifestModule.GetPEKind(out peKind, out imageFileMachine)
Luego debe examinar el peKind
para verificar su valor. Consulte los documentos de MSDN para PortableExecutableKinds
para obtener más información.