Yürütülebilir bir dosyam var ve bu dosyanın .NET çerçevesinin hangi sürümlerinin başlatılması gerektiğini bilmek istiyorum.
Bu bilgiyi bir yerde bulmanın kolay bir yolu var mı?
Yanıtlar:
Ben güvenilir şekilde alabilirsiniz yakın sürümü belirlemek için olduğunu düşünüyorum CLR gereklidir. Bunu ILDASM kullanarak ve "MANIFEST" düğümüne veya Reflector'a bakarak ve "Application.exe" düğümünün demontaj görünümüne IL olarak bakarak yapabilirsiniz. Her iki durumda da CLR versiyonunu gösteren bir yorum vardır. ILDASM'de yorum "// Meta veri sürümü" ve Reflector'da yorum "Hedef Çalışma Zamanı Sürümü" dür.
WindowsFormsApplication1.exe adlı bir .NET WinForms uygulamasına örnekler:
ILDASM:
// Metadata version: v2.0.50727
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
.assembly extern System
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
Reflektör:
.module WindowsFormsApplication1.exe
.subsystem 0x0002
// MVID: {CA3D2090-16C5-4899-953E-4736D6BC0FA8}
// Target Runtime Version: v2.0.50727
Ayrıca referans verilen montajların listesine bakabilir ve en yüksek sürüm numarasına sahip referansı arayabilirsiniz.
Yine, ILDASM'yi kullanarak "MANIFEST" düğüm verilerine bakarak:
.assembly extern System.Drawing
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 2:0:0:0
}
.assembly extern System.Core
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 3:5:0:0
}
Ve Reflektör kullanarak, listelenen her referans için dissambly'ye (hala IL olarak) bakarak:
.assembly extern System.Core
{
.ver 3:5:0:0
.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}
En yüksek sürüm meta verisine sahip referansı bularak, başvurunun hangi Framework sürümünden geldiğini belirleyebilirsiniz; bu, uygulamanın çalışması için aynı Framework sürümüne ihtiyacınız olduğunu gösterir. Bununla birlikte, bunu% 100 güvenilir olarak görmezdim, ancak yakın zamanda değişeceğini düşünmüyorum.
Otuz yıllık, 200 kb boyutunda, önceden yüklenmiş araç Not Defteri'ni kullanarak :
notepad appname.exe
, F3
kadar .NET Framework,version=vX.Y
yukarı gösterileriv2.
... hala 100 kat daha kolay, sonra gigabaytlarca nokta net analiz araçları ve çöp stüdyoları kurmak.Başka editör / izleyici Not Defteri ++ veya TotalCommander harika metin / hex görüntüleyici gibi, çok ikilileri açabilir Lister .
Daha basitleştirilmiş bir yaklaşım, dotPeek'i kullanmak ve ağaçta neyin göründüğünü görmek olacaktır .
Artık bir derlemenin hedef çerçevesini incelemek için ILSpy'ı kullanabilirsiniz . Montajı yükledikten sonra, montaj düğümünün köküne tıklayın ve bilgileri TargetFramework bildirimi altında bulabilirsiniz:
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
Koddan kullanabilirsiniz, Assembly.ImageRuntimeVersion
ancak dosyaya bakarak muhtemelen yapılacak en iyi şey reflektör kullanmak ve hangi sürümüne mscorlib
başvurulduğunu görmek olacaktır.
Düzenleme: Daha da iyisi ildasm kullanmak , montajınızı açmak ve ardından montaj için manifest'i görüntülemek olacaktır. Bildirimin ilk satırı , derlemenin oluşturulduğu CLR'nin tam sürümünü size söyleyecektir .
CorFlags.exe adlı bir araç kullanabilirsiniz. .NET 2.0'dan beri ortalıktaydı ve Windows SDK 7.0'da bulunduğundan eminim. Varsayılan olarak (Windows XP Pro'da) C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe klasörüne yüklenir. Sürümü içeren üstbilgi bilgilerini görüntülemek için yönetilen bir modüle (başka komut satırı işaretleri olmadan) dosya yolunu sağlayın.
Bu yardımcı programın bir modülün PE32 başlığını değiştirmek için tasarlandığını unutmayın, bu nedenle belgeleri dikkatlice okuyana kadar bayrakların hiçbirini kullanmayın .
Powershell kullanarak Windows'ta bir dosyanın .NET sürümünü edinebilirsiniz. Aşağıdaki script;
$path=’.\’
$ErrorActionPreference = "SilentlyContinue"
$files=Get-ChildItem -Path $path -Recurse -include *.dll,*.exe
foreach($file in $files)
{
$filename = $file.BaseName
$version = $([System.Reflection.Assembly]::ReflectionOnlyLoadFrom($file.FullName).GetCustomAttributesData() |
select-object -ExpandProperty ConstructorArguments |
select-object -ExpandProperty Value |
select-string -Pattern '.NET')
Write-Output "$filename,$version"
}
Sonucun o klasördeki exe dosyaları için .NET sürümünü çıkardığını, ancak aynı dll için de aynı şeyi yapacağını unutmayın.
Veya System.Core'un hangi referansına sahip olduğunu öğrenebilirsiniz. Bu size uygulamanın kullandığı .NET Framework sürümünü söyleyecektir. 2.0 için System.Core sürümü 2.0.xxx.xxx olacaktır. 3.5 için sürüm 3.5.xxx.xxx vb. Olacaktır.