Saya memiliki dll lama yang dikompilasi terhadap kerangka .NET dan digunakan. Saya tidak yakin versi kerangka .NET mana yang dikompilasi. Saya bertanya-tanya bagaimana saya dapat menentukan versi mana dari kerangka NET. Dll ini telah dikompilasi? Saya tidak dapat mempercayai kode sumber karena saya yakin telah ditingkatkan ke Visual Studio 2008 dan diubah ke .NET framework versi 3.5.
.net
.net-framework-version
mpenrow.dll
sumber
sumber
Jawaban:
Muat ke Reflector dan lihat apa itu referensinya?
sebagai contoh:
sumber
Di PowerShell Anda dapat menggunakan yang berikut ini untuk mendapatkan runtime target:
$path = "C:\Some.dll" [Reflection.Assembly]::ReflectionOnlyLoadFrom($path).ImageRuntimeVersion
Saya menyesuaikan ini ke PowerShell dari jawaban Ben Griswold .
Jika Anda ingin mengetahui versi kerangka kerja target yang ditentukan dalam Visual Studio, gunakan:
$path = "C:\Some.dll" [Reflection.Assembly]::ReflectionOnlyLoadFrom($path).CustomAttributes | Where-Object {$_.AttributeType.Name -eq "TargetFrameworkAttribute" } | Select-Object -ExpandProperty ConstructorArguments | Select-Object -ExpandProperty value
Anda harus mendapatkan sesuatu seperti
sumber
dotPeek adalah alat (gratis) yang hebat untuk menampilkan informasi ini.
Jika Anda mengalami beberapa masalah dalam mendapatkan Reflector maka ini adalah alternatif yang baik.
sumber
Anda dapat menggunakan ILDASM ...
ildasm.exe C:\foo.dll /metadata[=MDHEADER] /text /noil
dan periksa 'bagian Metadata' di keluaran. Ini akan menjadi seperti ini:
Tag 'versi' akan memberi tahu Anda versi .NET Framework. Pada contoh di atas adalah 4.0.30319
sumber
// Metadata section: 0x424a5342, version: 1.1, extra: 0, version len: 12, versio n: v4.0.30319
Gunakan ILSpy http://ilspy.net/
open source, gratis, pasti merupakan pilihan karena sekarang reflektor sudah dibayar.
sumber
Anda memiliki beberapa opsi: Untuk mendapatkannya secara terprogram, dari kode yang dikelola, gunakan Assembly.ImageRuntimeVersion:
Dim a As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("C:\path\assembly.dll") Dim s As String = a.ImageRuntimeVersion
Dari baris perintah, mulai dari v2.0, ildasm.exe akan menampilkannya jika Anda mengklik dua kali pada "MANIFEST" dan mencari "Metadata version". Menentukan Versi CLR Gambar
sumber
Sederhana saja
var tar = (TargetFrameworkAttribute)Assembly .LoadFrom("yoursAssembly.dll") .GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();
sumber
GetCustomAttributes
memilikiTargetFrameworkAttribute
. Tapi ImageRuntimeVersion berfungsi dengan baik, ia mengambil CLR yang tepat untuk biner itu dibuat. Saya memerlukan versi kerangka kerja target yang digunakan untuk membuatnya.Namun opsi lain melalui Visual Studio, tambahkan referensi ke DLL ke proyek apa pun, lalu klik kanan pada referensi baru dan klik Properties, Anda dapat melihat apa yang Anda cari dalam versi Runtime:
sumber
Dekompilasi dengan ILDASM, dan lihat versi mscorlib yang sedang direferensikan (seharusnya cukup banyak tepat di atas).
sumber
Cara termudah: cukup buka .dll di editor teks mana saja. Lihat salah satu baris terakhir:
sumber
Saya dengan cepat menulis aplikasi konsol C # ini untuk melakukan ini:
https://github.com/stuartjsmith/binarydetailer
Cukup lewati direktori sebagai parameter dan itu akan melakukan yang terbaik untuk memberi tahu Anda kerangka kerja bersih untuk setiap dll dan exe di sana
sumber
" Detect It Easy " juga dikenal sebagai DiE adalah program untuk menentukan jenis file. Bekerja dengan file .dll atau file (.exe) lainnya. Benar-benar gratis untuk penggunaan komersial dan non-komersial.
sumber
Jika Anda memiliki
DotPeek
dariJetBrains
, Anda dapat melihatnya diAssembly Explorer
.sumber
Memperluas jawaban di sini, ini dapat meledak jika ada majelis yang bergantung. Jika Anda beruntung dan Anda tahu di mana dependensinya (atau bahkan lebih beruntung, ada di GAC) maka ini dapat membantu ...
using System.Reflection; using System.Runtime.Versioning; // ... { AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve); var asm = System.Reflection.Assembly.LoadFrom(@"C:\Codez\My.dll"); var targetFrameAttribute = asm.GetCustomAttributes(true).OfType<TargetFrameworkAttribute>().FirstOrDefault(); targetFrameAttribute.Dump(); } Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args) { var name = args.Name; if (name.StartsWith("Depends")) return System.Reflection.Assembly.ReflectionOnlyLoadFrom(@"C:\Codez\Depends.dll"); return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name); }
Referensi: https://weblog.west-wind.com/posts/2006/Dec/22/Reflection-on-Problem-Assemblies
sumber