Bagaimana cara mengetahui versi .NET Framework mana yang perlu dijalankan?

97

Saya memiliki file yang dapat dieksekusi, dan saya ingin tahu versi kerangka .NET mana yang perlu dijalankan file ini.

Adakah cara mudah untuk menemukan informasi ini di suatu tempat?

(Sejauh ini saya mencoba ILDASM dan DUMPBIN tanpa keberuntungan.)

Sam
sumber
Lihat juga stackoverflow.com/questions/3460982/…
Ruben Bartelink
docs.microsoft.com/en-us/sysinternals/downloads - Process Explorer melakukan ini dengan sangat baik dan mudah digunakan, jalankan saja sebagai admin
AquaAlex

Jawaban:

55

Saya pikir yang paling dekat yang bisa Anda dapatkan dengan andal adalah menentukan versi CLR apa yang diperlukan. Anda dapat melakukan ini dengan menggunakan ILDASM dan melihat node "MANIFEST" atau Reflector dan melihat tampilan pembongkaran dari node "Application.exe" sebagai IL. Dalam kedua kasus tersebut ada komentar yang menunjukkan versi CLR. Dalam ILDASM, komentarnya adalah "// Metadata version" dan di Reflector komentarnya adalah "Target Runtime Version".

Berikut adalah contoh untuk aplikasi .NET WinForms bernama WindowsFormsApplication1.exe:

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
}

Reflektor:

.module WindowsFormsApplication1.exe
.subsystem 0x0002
// MVID: {CA3D2090-16C5-4899-953E-4736D6BC0FA8}
// Target Runtime Version: v2.0.50727

Anda juga dapat melihat daftar rakitan yang direferensikan dan mencari referensi dengan nomor versi tertinggi.

Sekali lagi, menggunakan ILDASM dengan melihat data node "MANIFEST":

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

Dan menggunakan Reflector, melihat dissambly (masih sebagai IL) untuk setiap referensi yang tercantum:

.assembly extern System.Core
{
    .ver 3:5:0:0
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}

Dengan mencari referensi dengan metadata versi tertinggi, Anda dapat menentukan versi Framework mana referensi tersebut berasal, yang akan menunjukkan bahwa Anda memerlukan versi Framework yang sama yang diinstal agar aplikasi dapat berjalan. Karena itu, saya tidak akan menganggap ini 100% dapat diandalkan, tetapi saya tidak berpikir itu akan berubah dalam waktu dekat.

Scott Dorman
sumber
4
Sayangnya Microsoft memperkenalkan perubahan besar untuk teknik di atas. Rakitan .NET 4.5 tidak dapat berjalan di mentah .NET 4, dan untuk memberi tahu rakitan .NET 4.5 Anda juga perlu membaca System.Runtime.Versioning.TargetFrameworkAttribute. lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html
Lex Li
56

Menggunakan Notepad , berusia tiga dekade, berukuran 200kb, alat prainstal:

  • buka aplikasi dengan notepad appname.exe,
  • cari kata "framework",
  • ulangi pencarian terakhir F3sampai .NET Framework,version=vX.Ymuncul
  • jika tidak ada yang ditemukan (versi di bawah 3.0) cari v2.... masih 100 kali lebih mudah daripada menginstal gigabyte alat penganalisis dot net dan studio sampah.

Editor / penampil lain juga dapat membuka biner, seperti Notepad ++ atau lister penampil teks / hex yang hebat dari totalCommander .

Asain Kujovic
sumber
Ini bagus- terutama jika Anda tidak memiliki akses ke dekompilasi / alat lain
Craig
@BentTranberg menarik, dapatkah Anda mengirimkan saya exe entah bagaimana, asainnp di gmail com.
Asain Kujovic
32

Pendekatan yang lebih sederhana adalah dengan menggunakan dotPeek dan melihat apa yang muncul di pohon.

Lihat panel properti: masukkan deskripsi gambar di sini

Daniel A. White
sumber
22

Anda sekarang dapat menggunakan ILSpy untuk memeriksa kerangka kerja target dari suatu rakitan. Setelah memuat assembly, klik pada root node assembly, dan Anda dapat menemukan informasi di bawah deklarasi TargetFramework:

[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
tsandhol.dll
sumber
2
Perhatikan bahwa TargetFrameworkAttribute hanya ditambahkan di .NET 4.0, jadi tidak akan ada pada rakitan yang dikompilasi terhadap .NET 3.5 atau sebelumnya.
Wai Ha Lee
ILSpy menampilkan "Runtime: vXXX" di komentar saat mengklik node root assembly yang dimuat. Saya bisa melihat proyek kerangka v1.1.4322.
ryancdotnet
15

Dari kode Anda dapat menggunakan Assembly.ImageRuntimeVersiontetapi dengan melihat file mungkin hal terbaik untuk dilakukan adalah menggunakan reflektor dan melihat versi mana yang mscorlibsedang direferensikan.

Sunting: Bahkan lebih baik akan menggunakan ildasm , buka perakitan Anda dan kemudian melihat manifes untuk perakitan. Baris pertama manifes akan memberi tahu Anda versi persis CLR yang digunakan untuk perakitan tersebut.

Andrew Hare
sumber
3
Ini salah. OP bertanya tentang versi .NET Framework, bukan versi CLR Runtime. Jawaban ini menjawab pertanyaan yang terakhir. Sebagai contoh, saya menjalankan Framework 4.7.2531.0 yang menggunakan CLR Runtime versi 4.0.30139. ImageRuntimeVersion mengembalikan versi CLR, bukan versi Framework.
Tom Baxter
11

Anda dapat menggunakan alat yang disebut CorFlags.exe. Sudah ada sejak .NET 2.0, dan saya tahu pasti bahwa itu disertakan dalam Windows SDK 7.0. Secara default (pada Windows XP Pro) ini diinstal ke C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe. Berikan jalur file ke modul terkelola (tanpa tanda baris perintah lainnya) untuk menampilkan informasi headernya, yang menyertakan versinya.

Ingatlah bahwa utilitas ini dirancang untuk mengubah header PE32 dari sebuah modul, jadi jangan gunakan tanda apa pun hingga Anda membaca dokumentasi dengan cermat.

Vince Fedorchak
sumber
1
Tidak dapat membedakan antara .Net4 dan .Net4.5
mheyman
11

Dari baris perintah: find "Framework" MyApp.exe

Sean B
sumber
2

Atau Anda bisa mencari tahu referensi System.Core mana yang dimilikinya. Itu akan memberi tahu Anda versi .NET Framework yang digunakan aplikasi ini. Untuk 2.0 versi System.Core adalah 2.0.xxx.xxx. Untuk 3.5 versinya adalah 3.5.xxx.xxx, dll.

Denis
sumber
Saya rasa ini tidak benar. Saya memiliki kerangka kerja target 4,5 tetapi menggunakan System.Core 4.0.XXX.XXX
Paul Totzke
2

Anda bisa mendapatkan file versi .NET di Windows menggunakan Powershell. Script berikut;

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

memberikan hasil sebagai berikut; masukkan deskripsi gambar di sini

Perhatikan bahwa hasil mengekstrak versi .NET untuk file exe di folder itu, tetapi itu juga akan melakukan hal yang sama untuk dll.

Mark Walker
sumber
1

Di Linux / OSX / unix Anda dapat menggunakan:

strings that_app.exe | grep 'v2.\|Framework'
Pierz
sumber