كيفية معرفة ما إذا تم تجميع مجموعة .NET كـ X86 أو X64 أو أي وحدة المعالجة المركزية

StackOverflow https://stackoverflow.com/questions/1591557

  •  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 في باورشيل امتدادات المجتمع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top