2009-10-19 6 views
30

Bir .NET derleme DLL dosyasının 'x86', 'x64' olarak derlenmiş olup olmadığını (kaynak projeye erişim olmadan) bulmanın en kolay yolu nedir? veya 'Herhangi bir CPU'?Bir .NET Derlemesinin x86, x64 veya Herhangi Bir CPU Olarak Derlenmiş Olması Nasıl Anlaşılır

Güncelleme: Bir komut satırı yardımcı programı acil gereksinimlerimi karşılamak için yeterliydi, ancak tamlık adına, birisi bana programlı olarak nasıl yapılacağını söylemek istiyorsa, o da ilgi çekici olurdu. .

CorFlags.exe assembly.dll 

kodu kullanarak bunu yapmak istiyorsanız: sadece belirli bir dll bu öğrenmek istiyorsanız

+0

. Sonra bu farklılıklar için dll ikili dosyalarını arardım ve (umarım) size istediğiniz sonucu verir. Bu bile zor geliyor, hata eğilimli ve ben bunu tavsiye etmem. (Dll bu bilgiyi kendisi içerip içermediğini bilmiyorum) –

+0

Bir araç mı arıyorsunuz yoksa bunu programlı olarak nasıl yapıyorsunuz? – pbz

+0

İdeal olarak, sağ tıklatın/özellikleri/ayrıntıları, ancak alas :( –

cevap

45

, o zaman Windows SDK bir parçası olan CorFlags aracını kullanabilirsiniz , Module sınıfın GetPEKind yöntemi bir göz atın:

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

Daha sonra, onun değerini kontrol etmek peKind incelemek gerekir. Daha fazla bilgi için PortableExecutableKinds için MSDN docs'a bakın.

+0

Teşekkürler CorFlags.exe'yi çalıştırdım ama çıktısını nasıl okuyacağımı anlamıyorum.Ne görüyorsam mecburiyet x86/x64/AnyCPU? –

+1

@ColonelPanic: '32BIT' bayrağı için bak. ', sonra montaj sadece 32-bit için derlendi. – adrianbanks

+0

VS 2008, VS 2010, VS 2012 ve VS 2013 yüklerim. C: \ Program Files (x86) \ Microsoft SDKs \ alt klasörlerinde 8 dosya CorFlags.exe var Kullanmam gereken pencere hangisi? – Kiquenet

13

Teşekkürler Adrian! Snippet'i PowerShell'de yeniden yazdım, böylece sunucuda kullanabildim.

#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

Müthiş. Yapabilirsem +2 verirdim – JMarsch

2

Teşekkürler Adrian ve Peter! İşte Peter's Get-Bitness'in değiştirilmiş bir versiyonudur. 1) pipeline incelemek için bir dosya listesi alır ve 2) non.NET DLL dosyasına bakarsa ölmez (örneğin, belirli C++ DLL'lerine bakarsa) :

PowerShell'e yeni geldim, bu nedenle bu en iyi uygulama örneklerinden biri olmayabilir. https://stackoverflow.com/a/4719567/64257'a göre 'a göre, PowerShell Community Extensions'da kullanışlı bir Get-PEHeader cmdlet'i de bulunabilir. Powershell yanıtlara dayalı

3

C# pasajı,: Ben ISA en x86 ve x64 için üzerinden arama tavsiye ve ikisi arasındaki farklı talimatlar kümesini üretecek

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();