كيفية معرفة ما إذا تم تجميع مجموعة .NET كـ X86 أو X64 أو أي وحدة المعالجة المركزية
-
22-09-2019 - |
سؤال
ما هي أسهل طريقة لاكتشاف (دون الوصول إلى المشروع المصدر) سواء تم تجميع مجموعة DLL .NET كـ "X86" أو "X64" أو "أي وحدة معالجة المعالجة المركزية"؟
تحديث: كانت الأداة المساعدة لخط الأوامر كافية لتلبية احتياجاتي الفورية ، ولكن فقط من أجل الاكتمال ، إذا أراد شخص ما أن يخبرني بكيفية القيام به برمجيًا ، فسيكون ذلك موضع اهتمام أيضًا ، أنا متأكد.
المحلول
إذا كنت ترغب فقط في العثور على هذا على DLL معين ، فيمكنك استخدام corflags الأداة التي هي جزء من Windows SDK:
CorFlags.exe assembly.dll
إذا كنت ترغب في القيام بذلك باستخدام الكود ، ألق نظرة على getPekind طريقة وحدة صف دراسي:
Assembly assembly = Assembly.LoadFrom("path to dll");
PortableExecutableKinds peKind;
ImageFileMachine imageFileMachine;
assembly.ManifestModule.GetPEKind(out peKind, out imageFileMachine)
تحتاج بعد ذلك إلى فحص peKind
للتحقق من قيمتها. انظر مستندات MSDN ل PortableExecutableKinds
لمزيد من المعلومات.
نصائح أخرى
شكرا أدريان! لقد قمت بإعادة كتابة المقتطف في 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
}
C# SNIPPET ، استنادًا إلى إجابات 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();
شكرا أدريان وبيتر! فيما يلي نسخة معدلة من Peter's Pitness التي 1) تأخذ قائمة من الملفات لفحصها من خط الأنابيب ، و 2) لا يموت إذا نظرت إلى DLL غير. NET (على سبيل المثال ، إذا نظرت إلى بعض DLLS 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
}
}
}
أنا جديد على PowerShell ، لذلك قد لا يكون هذا مثالًا على أفضل الممارسات.
بدلا من ذلك ، وفقا ل https://stackoverflow.com/a/4719567/64257 قد يكون هناك أيضًا cmdlet get-peheader في باورشيل امتدادات المجتمع.