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.)
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.)
Jawaban:
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.
Menggunakan Notepad , berusia tiga dekade, berukuran 200kb, alat prainstal:
notepad appname.exe, F3sampai .NET Framework,version=vX.Ymunculv2.... 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 .
Pendekatan yang lebih sederhana adalah dengan menggunakan dotPeek dan melihat apa yang muncul di pohon.
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")]
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.
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.
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.
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;

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