Tôi có một tệp thực thi và tôi muốn biết phiên bản .NET framework nào mà tệp này cần được khởi động.
Có cách nào dễ dàng để tìm thông tin này ở đâu đó không?
(Cho đến nay tôi đã thử ILDASM và DUMPBIN mà không gặp may mắn.)
Tôi có một tệp thực thi và tôi muốn biết phiên bản .NET framework nào mà tệp này cần được khởi động.
Có cách nào dễ dàng để tìm thông tin này ở đâu đó không?
(Cho đến nay tôi đã thử ILDASM và DUMPBIN mà không gặp may mắn.)
Câu trả lời:
Tôi nghĩ rằng gần nhất bạn đáng tin cậy có thể nhận được là để xác định những gì phiên bản của CLR là bắt buộc. Bạn có thể thực hiện việc này bằng cách sử dụng ILDASM và nhìn vào nút "MANIFEST" hoặc Reflector và nhìn vào chế độ giải tán của nút "Application.exe" dưới dạng IL. Trong cả hai trường hợp, có một nhận xét cho biết phiên bản CLR. Trong ILDASM, nhận xét là "// Phiên bản siêu dữ liệu" và trong Reflector, nhận xét là "Phiên bản thời gian chạy đích".
Dưới đây là các ví dụ cho ứng dụng .NET WinForms có tên 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
}
Người phản ánh:
.module WindowsFormsApplication1.exe
.subsystem 0x0002
// MVID: {CA3D2090-16C5-4899-953E-4736D6BC0FA8}
// Target Runtime Version: v2.0.50727
Bạn cũng có thể xem danh sách các cụm được tham chiếu và tìm tham chiếu có số phiên bản cao nhất.
Một lần nữa, sử dụng ILDASM để xem dữ liệu nút "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
}
Và bằng cách sử dụng Reflector, xem xét sự phân tán (vẫn là IL) cho mỗi tham chiếu được liệt kê:
.assembly extern System.Core
{
.ver 3:5:0:0
.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}
Bằng cách tìm tham chiếu với siêu dữ liệu phiên bản cao nhất, bạn có thể xác định xem tham chiếu đó đến từ phiên bản nào, điều này sẽ cho biết rằng bạn cần cùng một phiên bản Framework được cài đặt để ứng dụng chạy. Nói như vậy, tôi sẽ không coi điều này là đáng tin cậy 100%, nhưng tôi không nghĩ nó sẽ sớm thay đổi.
Sử dụng Notepad , ba thập kỷ, dung lượng 200kb, công cụ được cài đặt sẵn:
notepad appname.exe
, F3
cho đến khi .NET Framework,version=vX.Y
hiển thịv2.
... vẫn dễ dàng hơn 100 lần sau đó cài đặt hàng gigabyte của các công cụ phân tích dot net và các studio rác.Bất kỳ khác biên tập viên / người xem có thể mở tập tin nhị phân quá, như Notepad ++ hoặc text / hex viewer lớn Total Commander của lister .
Một cách tiếp cận đơn giản hơn sẽ là sử dụng dotPeek và xem những gì hiển thị trong cây.
Bây giờ bạn có thể sử dụng ILSpy để kiểm tra khung mục tiêu của một assembly. Sau khi tải lắp ráp, hãy nhấp vào gốc của nút lắp ráp và bạn có thể tìm thấy thông tin trong khai báo TargetFramework:
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
Từ mã, bạn có thể sử dụng Assembly.ImageRuntimeVersion
nhưng bằng cách xem tệp, điều tốt nhất nên làm là sử dụng phản xạ và xem phiên bản nào mscorlib
đang được tham chiếu.
Chỉnh sửa: Thậm chí tốt hơn là sử dụng ildasm , mở assembly của bạn và sau đó xem tệp kê khai cho assembly. Dòng đầu tiên của tệp kê khai sẽ cho bạn biết phiên bản chính xác của CLR mà lắp ráp được tạo cho.
Bạn có thể sử dụng một công cụ có tên là CorFlags.exe. Nó đã ra đời từ .NET 2.0 và tôi biết chắc rằng nó được bao gồm trong Windows SDK 7.0. Theo mặc định (trên Windows XP Pro), nó được cài đặt vào C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe. Cung cấp cho nó đường dẫn tệp đến mô-đun được quản lý (không có bất kỳ cờ dòng lệnh nào khác) để hiển thị thông tin tiêu đề của nó, bao gồm cả phiên bản.
Hãy nhớ rằng tiện ích này được thiết kế để sửa đổi tiêu đề PE32 của mô-đun, vì vậy không sử dụng bất kỳ cờ nào cho đến khi bạn đọc kỹ tài liệu .
Hoặc bạn có thể chỉ cần tìm tham chiếu của System.Core nó có. Điều đó sẽ cho bạn biết phiên bản .NET Framework mà ứng dụng này đang sử dụng. Đối với phiên bản 2.0 của System.Core sẽ là 2.0.xxx.xxx. Đối với 3.5, phiên bản sẽ là 3.5.xxx.xxx, v.v.
Bạn có thể tải xuống phiên bản .NET của tệp trong Windows bằng Powershell. Tập lệnh sau;
$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"
}
Lưu ý rằng kết quả giải nén phiên bản .NET cho các tệp exe trong thư mục đó, nhưng nó cũng sẽ thực hiện tương tự đối với một dll.