Làm cách nào để tìm ra phiên bản .NET Framework mà tệp thực thi cần để chạy?


97

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ử ILDASMDUMPBIN mà không gặp may mắn.)



docs.microsoft.com/en-us/sysinternals/downloads - Process Explorer thực hiện điều này rất tốt và dễ sử dụng, chỉ cần chạy nó với tư cách quản trị viên
AquaAlex 19/08/19

Câu trả lời:


55

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.


4
Thật không may, Microsoft giới thiệu một thay đổi đột phá cho kỹ thuật trên. Các hợp ngữ .NET 4.5 không thể chạy trên .NET 4 thô và để nói với một hợp ngữ .NET 4.5, bạn cũng cần đọc System.Runtime.Versinstall.TargetFrameworkAttribute. lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html
Lex Li

56

Sử dụng Notepad , ba thập kỷ, dung lượng 200kb, công cụ được cài đặt sẵn:

  • mở ứng dụng với notepad appname.exe,
  • tìm kiếm từ "framework",
  • lặp lại tìm kiếm cuối cùng với F3cho đến khi .NET Framework,version=vX.Yhiển thị
  • nếu không tìm thấy gì (các phiên bản dưới 3.0) thì tìm kiếm 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 .


Đây là great- đặc biệt là nếu bạn không có quyền truy cập vào dịch ngược / công cụ khác
Craig

@BentTranberg thú vị, bạn có thể gửi cho tôi exe bằng cách nào đó, asainnp tại gmail com.
Asain Kujovic

32

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.

Xem bảng thuộc tính: nhập mô tả hình ảnh ở đây


22

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")]

2
Lưu ý rằng TargetFrameworkAttribute chỉ được thêm vào .NET 4.0, vì vậy sẽ không có mặt trên các hội đồng được biên dịch dựa trên .NET 3.5 hoặc phiên bản cũ hơn.
Wai Ha Lee

ILSpy hiển thị "Runtime: vXXX" trong các nhận xét khi nhấp vào nút gốc lắp ráp được tải. Tôi đã có thể xem một dự án khung v1.1.4322.
ryancdotnet

15

Từ mã, bạn có thể sử dụng Assembly.ImageRuntimeVersionnhư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.


3
Cái này sai. OP đã hỏi về phiên bản .NET Framework, không phải phiên bản của CLR Runtime. Câu trả lời này giải quyết phần sau. Ví dụ: tôi đang chạy với Framework 4.7.2531.0 sử dụng phiên bản CLR Runtime 4.0.30139. ImageRuntimeVersion trả về phiên bản CLR, không phải phiên bản Framework.
Tom Baxter

11

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 .


1
Không thể phân biệt giữa .Net4 và .Net4.5
mheyman


2

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.


Tôi không nghĩ điều này là đúng. Tôi có một khuôn khổ mục tiêu là 4,5 nhưng sử dụng System.Core 4.0.XXX.XXX
Paul Totzke

2

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

cung cấp kết quả sau; nhập mô tả hình ảnh ở đây

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.


1

Trên Linux / OSX / unix, bạn có thể sử dụng:

strings that_app.exe | grep 'v2.\|Framework'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.