Bir yürütülebilir dosyanın hangi .NET Framework sürümünü çalıştırması gerektiğini nasıl öğrenebilirim?


98

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ı?

(Şimdiye kadar ILDASM ve DUMPBIN'i şanssız denedim .)



docs.microsoft.com/en-us/sysinternals/downloads - İşlem Gezgini bunu çok iyi yapıyor ve kullanımı kolay, sadece yönetici olarak çalıştırın
AquaAlex

Yanıtlar:


55

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.


4
Ne yazık ki Microsoft, yukarıdaki teknik için önemli bir değişiklik getiriyor. .NET 4.5 derlemeleri ham. lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html
Lex Li

58

Otuz yıllık, 200 kb boyutunda, önceden yüklenmiş araç Not Defteri'ni kullanarak :

  • ile uygulamayı açın notepad appname.exe,
  • "çerçeve" kelimesini arayın,
  • ile tekrar son arama F3kadar .NET Framework,version=vX.Yyukarı gösterileri
  • eğer hiçbir şey bulunamazsa (3.0'ın altındaki sürümler) şunu arar v2.... 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 .


Bu harika - özellikle de derleme / diğer araçlara erişiminiz yoksa
Craig

@BentTranberg ilginç, bana bir şekilde exe gönderebilir misin, asainnp gmail com'da.
Asain Kujovic


22

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")]

2
O Not TargetFrameworkAttribute sadece .NET 4.0 eklenmiş, bu şekilde .NET 3.5 veya daha önceki karşı derlenmiş meclisleri mevcut olmayacaktır.
Wai Ha Lee

ILSpy, yüklü derleme kök düğümüne tıklandığında yorumlarda "Çalışma Zamanı: vXXX" gösteriyor. Bir v1.1.4322 çerçeve projesi görebildim.
ryancdotnet

15

Koddan kullanabilirsiniz, Assembly.ImageRuntimeVersionancak dosyaya bakarak muhtemelen yapılacak en iyi şey reflektör kullanmak ve hangi sürümüne mscorlibbaş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 .


3
Bu yanlış. OP, CLR Runtime'ın sürümünü değil, .NET Framework sürümünü sordu. Bu cevap ikincisine hitap ediyor. Örnek olarak, CLR Runtime sürüm 4.0.30139'u kullanan Framework 4.7.2531.0 ile çalışıyorum. ImageRuntimeVersion, Framework sürümünü değil, CLR sürümünü döndürür.
Tom Baxter


11

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 .


2
.Net4 ve .Net4.5 arasında ayrım yapılamıyor
mheyman

3

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"
}

aşağıdaki sonucu sağlar; görüntü açıklamasını buraya girin

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.


2

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.


Bunun doğru olduğunu sanmıyorum. 4.5 hedef çerçevem ​​var ancak System.Core 4.0.XXX.XXX kullanıyorum
Paul Totzke

1

Linux / OSX / unix üzerinde şunları kullanabilirsiniz:

strings that_app.exe | grep 'v2.\|Framework'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.