Tentukan versi .NET Framework untuk dll

139

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.

mpenrow.dll
sumber

Jawaban:

50

Muat ke Reflector dan lihat apa itu referensinya?

sebagai contoh:

masukkan deskripsi gambar di sini

ParmesanCodice
sumber
1
Ide saya juga, tetapi mengetahui reflektor, mungkin akan mengeluh, dan memberikan ikon kesalahan non-deskripsi yang bagus.
leppie
@leppie Seharusnya tidak menjadi masalah, meskipun itu .NET 1.1. Ubah saja daftar perakitan default Anda.
ParmesanCodice
Jawaban Anda sangat membantu, tetapi saya menyarankan untuk tidak mengandalkannya secara membabi buta - kemarin saya menghabiskan terlalu banyak waktu untuk proyek saya sendiri yang ditargetkan untuk .Net 4.0, dilaporkan oleh Reflector untuk menggunakan .Net 4.0.3, dan diharuskan untuk menggunakan .Net 4.5 oleh Windows :-) Saya tidak tahu metode apa pun untuk memverifikasi ini pada proyek selain dengan sumber - lihat di sini: stackoverflow.com/questions/13214503/…
greenoldman
3
Anda juga dapat menggunakan ILSpy alternatif sumber terbuka gratis seperti yang dicatat oleh Kat Lim Ruiz.
Marcus Mangelsdorf
Jawaban ini berhasil untuk saya: stackoverflow.com/a/3461027/2961177 .
ckkkitty
132

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

.NETFramework, Versi = v4.5.2

Swoogan
sumber
4
Jawaban ini paling membantu. Semua OS Windows setelah 2003 mendukung Powershell. Sebuah shell memberikan umpan balik langsung, tidak memerlukan dukungan aplikasi tambahan seperti yang disarankan oleh banyak jawaban lain. Bagus untuk pemeriksaan "satu kali" dari dll. Anda laki-laki @oogan.
Nathan McCoy
1
Saya melakukan ini untuk DLL yang saya buat dengan TargetFrameworkVersion v3.5, dan mengembalikan v2.0.50727. Apa yang saya lewatkan?
BHSPitMonkey
5
@BHSPitMonkey sebenarnya hanya ada 4 versi runtime: 1.0, 1.1, 2.0 dan 4.0. .NET 3.0 dan 3.5 dikompilasi ke CLR versi 2.0. msdn.microsoft.com/en-us/library/bb822049(v=vs.110).aspx
Swoogan
1
Skrip ini hanya menyediakan RuntimeVersion, pertanyaannya tentang TargetFrameworkversion. Secara efektif untuk semua rakitan yang dikompilasi terhadap 2.0,3.0,3.5 skrip ini menunjukkan versi Runtime sebagai 2.0.0.0
Kiran Vedula
3
Bagi saya ReflectionOnlyLoadFrom mengembalikan ImageRuntimeVersion tetapi nol CustomAttributes. Menggunakan LoadFrom sebagai ganti ReflectionOnlyLoadFrom memberikan hasil yang diharapkan. Alasan apapun? PSVersion 5.1.16299.251 CLRVersion 4.0.30319.42000
Bernard Vander Beken
70

dotPeek adalah alat (gratis) yang hebat untuk menampilkan informasi ini.

Jika Anda mengalami beberapa masalah dalam mendapatkan Reflector maka ini adalah alternatif yang baik.

masukkan deskripsi gambar di sini

wal
sumber
4
FYI, saya beralih dari DotPeek ke JustDecompile karena satu masalah: jika Anda memilih "versi tertentu = salah," DotPeek menunjukkan versi kosong, dan JustDecompile menunjukkan versi yang benar. Membuatnya layak untuk saya beralih.
ashes999
Hebat - melakukan apa yang saya inginkan tanpa menginstal uji coba untuk Reflector.
bernhardrusch
50

Anda dapat menggunakan ILDASM ...

ildasm.exe C:\foo.dll /metadata[=MDHEADER] /text /noil

dan periksa 'bagian Metadata' di keluaran. Ini akan menjadi seperti ini:

Bagian metadata: 0x424a5342, versi: 1.1, ekstra: 0, versi len: 12, versi: v4.0.30319

Tag 'versi' akan memberi tahu Anda versi .NET Framework. Pada contoh di atas adalah 4.0.30319

Josh Stodola
sumber
3
Apa yang saya cari di sini? Apakah ini berarti .NET 4.0? // Metadata section: 0x424a5342, version: 1.1, extra: 0, version len: 12, versio n: v4.0.30319
PeterX
Ya, untuk .NET 2 saya mendapatkan yang berikut: // Bagian metadata: 0x424a5342, versi: 1.1, ekstra: 0, versi len: 12, versi: v2.0.50727
Simon
19

Gunakan ILSpy http://ilspy.net/

open source, gratis, pasti merupakan pilihan karena sekarang reflektor sudah dibayar.

Kat Lim Ruiz
sumber
17

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

Ben Griswold
sumber
Bagaimana cara mendapatkan ImageRuntimeVersion untuk CurrentAppDomain?
Kiquenet
15

Sederhana saja

var tar = (TargetFrameworkAttribute)Assembly
          .LoadFrom("yoursAssembly.dll")
          .GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();
tegas
sumber
1
Saya tidak tahu mengapa ini telah diturunkan suara, tetapi saya dapat menjalankan cuplikan (diperlukan referensi ke System.Runtime.Versioning) dan berhasil mendapatkan output (ini dari LINQPad): TypeId typeof (TargetFrameworkAttribute) FrameworkName .NETFramework, Versi = v4.0 FrameworkDisplayName .NET Framework 4
Sudhanshu Mishra
Kode ini tidak mengambil versi lengkap kerangka kerja. "4.0" baik untuk diketahui, tetapi "v4.0.30319" akan lebih berguna jika Anda, misalnya, mencoba membuka RegAsm.exe. Informasi versi yang lebih lengkap dapat ditemukan di: string tar = Assembly.LoadFrom (@ "myAssembly.dll"). ImageRuntimeVersion;
Martin
Ini sepertinya pendekatan yang tepat, adakah keadaan di mana assembly mungkin tidak menerapkan atribut ini? Saya telah mengujinya dengan rakitan .NET Core dan dengan benar melaporkan netcore dan nomor versi.
Adam Naylor
Ini tidak berhasil untuk saya. Tidak GetCustomAttributesmemiliki TargetFrameworkAttribute. Tapi ImageRuntimeVersion berfungsi dengan baik, ia mengambil CLR yang tepat untuk biner itu dibuat. Saya memerlukan versi kerangka kerja target yang digunakan untuk membuatnya.
Shameel Mohamed
13

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:

masukkan deskripsi gambar di sini

lingo_journey
sumber
Saya pikir pertanyaan ini tidak menanyakan tentang kapan sebuah DLL direferensikan di Visual Studio, tetapi setiap .NET DLL yang Anda temukan tergeletak di sekitar PC Anda.
ashes999
7
Jawaban ini menunjukkan bahwa Anda dapat menambahkan referensi ke DLL .NET apa pun yang Anda temukan tergeletak di sekitar PC Anda, dan salah satu properti item di bawah Referensi yang sesuai dengan DLL tersebut adalah "Versi Runtime".
ALEXintlsos
8

Dekompilasi dengan ILDASM, dan lihat versi mscorlib yang sedang direferensikan (seharusnya cukup banyak tepat di atas).

leppie
sumber
6

Cara termudah: cukup buka .dll di editor teks mana saja. Lihat salah satu baris terakhir: masukkan deskripsi gambar di sini

cedenbal
sumber
Pilihan terbaik di antara semuanya
Sisir
2
Namun, ini tidak berfungsi untuk dll yang dibuat sebelumnya .Net 3.0
Sisir
2

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

stuartjsmith.dll
sumber
Memberikan info rinci yang bagus; itu adalah aplikasi baris perintah; Anda harus meneruskannya ke nama direktori pada baris perintah.
philu
2

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

masukkan deskripsi gambar di sini

20AMaks
sumber
0

Jika Anda memiliki DotPeekdari JetBrains, Anda dapat melihatnya di Assembly Explorer.

Bisakah Anda melihat tangkapan layar ini?  saya tidak :(

Sam Sch
sumber
0

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

Cowok CAD
sumber