Xác định phiên bản .NET Framework cho dll


137

Tôi có một dll cũ đã được biên dịch dựa trên .NET framework và được triển khai. Tôi không chắc chắn phiên bản .NET framework nào được biên dịch lại. Tôi tự hỏi làm thế nào tôi có thể xác định phiên bản nào của .NET framework mà dll này được biên dịch lại? Tôi không thể tin tưởng mã nguồn bởi vì tôi tin rằng nó đã được nâng cấp lên Visual Studio 2008 và được đổi thành .NET framework phiên bản 3.5.


Câu trả lời:


49

Tải nó vào Reflector và xem những gì nó tham khảo?

ví dụ:

nhập mô tả hình ảnh ở đây


1
Ý tưởng của tôi cũng vậy, nhưng biết phản xạ, nó có thể sẽ phàn nàn, và cho nó một biểu tượng lỗi không mô tả đẹp.
leppie

@leppie Không phải là vấn đề, ngay cả khi đó là .NET 1.1. Chỉ cần thay đổi danh sách lắp ráp mặc định của bạn.
ParmesanCodice

Câu trả lời của bạn rất hữu ích, nhưng tôi khuyên bạn không nên dựa vào nó một cách mù quáng - hôm qua tôi đã dành quá nhiều thời gian cho dự án của riêng mình được nhắm mục tiêu cho .Net 4.0, được Reflector báo cáo để sử dụng .Net 4.0.3, và bắt buộc phải sử dụng .Net 4.5 by Windows :-) Tôi không biết bất kỳ phương pháp nào để xác minh điều này trên dự án ngoài các nguồn - xem tại đây: stackoverflow.com/questions/13214503/
Lỗi

3
Bạn cũng có thể sử dụng ILSpy thay thế nguồn mở, miễn phí như Kat Lim Ruiz lưu ý .
Marcus Mangelsdorf

Câu trả lời này có hiệu quả với tôi: stackoverflow.com/a/3461027/2961177 .
ckkkitty

128

Trong PowerShell, bạn có thể sử dụng cách sau để nhận thời gian chạy đích:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).ImageRuntimeVersion

Tôi đã điều chỉnh nó thành PowerShell từ câu trả lời của Ben Griswold .

Nếu bạn muốn biết phiên bản khung đích được chỉ định trong Visual Studio, hãy sử dụng:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).CustomAttributes |
Where-Object {$_.AttributeType.Name -eq "TargetFrameworkAttribute" } | 
Select-Object -ExpandProperty ConstructorArguments | 
Select-Object -ExpandProperty value

Bạn sẽ nhận được một cái gì đó như

.NETFramework, Phiên bản = v4.5.2


4
Câu trả lời này là hữu ích nhất. Tất cả các hệ điều hành Windows sau 2003 đều hỗ trợ Powershell. Một vỏ cung cấp phản hồi ngay lập tức, không yêu cầu bất kỳ hỗ trợ ứng dụng bổ sung như nhiều câu trả lời khác cho thấy. Tuyệt vời cho việc kiểm tra "một lần" của một dll. bạn là người đàn ông @swoogan.
Nathan McCoy

1
Tôi đã làm điều này cho một DLL mà tôi đã xây dựng với TargetFrameworkVersion của v3.5 và nó trả về v2.0.50727. Tôi đang thiếu gì?
BHSPitMonkey

4
@BHSPitMonkey chỉ thực sự có 4 phiên bản thời gian chạy: 1.0, 1.1, 2.0 và 4.0. .NET 3.0 và 3.5 biên dịch sang CLR phiên bản 2.0. msdn.microsoft.com/en-us/l Library
bb822049 (v = vs.110) .aspx

1
Kịch bản này chỉ cung cấp RuntimeVersion, câu hỏi là về TargetFrameworkversion. Hiệu quả cho tất cả các hội đồng được biên dịch theo 2.0.3.0.3.5, tập lệnh này hiển thị phiên bản Thời gian chạy là 2.0.0.0
Kiran Vedula

3
Đối với tôi, ReflectionOnlyLoadFrom trả về ImageR.78Version nhưng không có CustomAttribution. Sử dụng LoadFrom thay vì ReflectionOnlyLoadFrom cho kết quả như mong đợi. Có lý do gì không? PSVersion 5.1.16299.251 CLRVersion 4.0.30319.42000
Bernard Vander Beken

69

dotPeek là một công cụ tuyệt vời (miễn phí) để hiển thị thông tin này.

Nếu bạn đang gặp một vài vấn đề về việc giữ Reflector thì đây là một lựa chọn tốt.

nhập mô tả hình ảnh ở đây


4
FYI, tôi đã chuyển từ DotPeek sang JustDecompile vì một vấn đề: nếu bạn chọn "phiên bản cụ thể = false", DotPeek hiển thị phiên bản trống và JustDecompile hiển thị phiên bản chính xác. Làm cho nó đáng để chuyển đổi cho tôi.
tro999

Tuyệt vời - đã làm chính xác những gì tôi muốn mà không cần cài đặt bản dùng thử cho Reflector.
bernhardrusch

49

Bạn có thể sử dụng ILDASM ...

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

và kiểm tra phần 'Siêu dữ liệu' trong đầu ra. Nó sẽ là một cái gì đó như thế này:

Phần siêu dữ liệu: 0x424a5342, phiên bản: 1.1, thêm: 0, phiên bản len: 12, phiên bản: v4.0.30319

Thẻ 'phiên bản' sẽ cho bạn biết phiên bản .NET Framework. Trong ví dụ trên, nó là 4.0.30319


3
Tôi đang tìm gì ở đây? Điều này có nghĩa là .NET 4.0? // Metadata section: 0x424a5342, version: 1.1, extra: 0, version len: 12, versio n: v4.0.30319
PeterX

Có, đối với .NET 2 tôi nhận được các thông tin sau: // Phần siêu dữ liệu: 0x424a5342, phiên bản: 1.1, thêm: 0, phiên bản len: 12, phiên bản: v2.0.50727
Simon

17

Bạn có một vài tùy chọn: Để có được nó theo chương trình, từ mã được quản lý, hãy sử dụng Association.ImageR.78Version:

Dim a As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("C:\path\assembly.dll")
Dim s As String = a.ImageRuntimeVersion

Từ dòng lệnh, bắt đầu từ v2.0, ildasm.exe sẽ hiển thị nó nếu bạn nhấp đúp vào "MANIFEST" và tìm "Phiên bản siêu dữ liệu". Xác định phiên bản CLR của hình ảnh


Làm cách nào để có được ImageR.78Version cho CurrentAppDomain?
Kiquenet


15

Chỉ đơn giản vậy thôi

var tar = (TargetFrameworkAttribute)Assembly
          .LoadFrom("yoursAssembly.dll")
          .GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();

1
Tôi không biết lý do tại sao điều này đã bị hạ cấp, nhưng tôi có thể chạy đoạn trích (tham chiếu đến System.R.78.Versioning là cần thiết) và nhận thành công đầu ra (đây là từ LINQPad): TypeId typeof (TargetFrameworkAttribution) FrameworkName .NETFramework, Phiên bản = v4.0 FrameworkDisplayName .NET Framework 4
Sudhanshu Mishra

Mã này không lấy phiên bản đầy đủ của khung. "4.0" là điều tốt để biết, nhưng "v4.0.30319" sẽ hữu ích hơn nếu bạn nói, cố gắng truy cập RegAsm.exe. Thông tin phiên bản đầy đủ hơn có thể được tìm thấy trong: chuỗi tar = hội.LoadFrom (@ "myAss lanh.dll"). ImageR nbVersion;
Martin

Điều này có vẻ như là cách tiếp cận đúng, có trường hợp nào một hội đồng có thể không áp dụng thuộc tính này không? Tôi đã thử nghiệm nó với một cụm .NET Core và nó báo cáo chính xác netcore và số phiên bản.
Adam Naylor

Điều này không làm việc cho tôi. Các GetCustomAttributeskhông có TargetFrameworkAttribute. Nhưng ImageR.78Version hoạt động tốt mặc dù, nó lấy đúng CLR mà nhị phân được tạo cho. Tôi cần phiên bản khung đích mà nó được xây dựng.
Shameel Mohamed

13

Một tùy chọn khác thông qua Visual Studio, thêm một tham chiếu đến DLL cho bất kỳ dự án nào, sau đó nhấp chuột phải vào tham chiếu mới và nhấp vào Thuộc tính, bạn có thể thấy những gì bạn đang tìm kiếm trong phiên bản Thời gian chạy:

nhập mô tả hình ảnh ở đây


Tôi nghĩ rằng câu hỏi này không phải là khi một DLL được tham chiếu trong Visual Studio, nhưng bất kỳ DLL DLL nào mà bạn tìm thấy nằm trên PC của bạn.
tro999

7
Câu trả lời này chỉ ra rằng bạn có thể thêm một tham chiếu đến bất kỳ DLL .NET nào mà bạn tìm thấy nằm trên PC của bạn và một trong các thuộc tính của mục trong Tài liệu tham khảo tương ứng với DLL đó là "Phiên bản thời gian chạy".
ALEXintlsos

8

Dịch ngược nó với ILDASM và xem phiên bản của mscorlib đang được tham chiếu (nên có khá nhiều ở ngay trên đầu).


4

Cách đơn giản nhất: chỉ cần mở dll trong bất kỳ trình soạn thảo văn bản nào. Nhìn vào một trong những dòng cuối cùng: nhập mô tả hình ảnh ở đây


Lựa chọn tốt nhất trong số tất cả
Sisir

2
Tuy nhiên, điều này không hoạt động đối với các dll được xây dựng trước .Net 3.0
Sisir

2

Tôi đã nhanh chóng viết ứng dụng bảng điều khiển C # này để làm điều này:

https://github.com/stuartjsmith/binarydetailer

Đơn giản chỉ cần chuyển một thư mục làm tham số và nó sẽ cố gắng hết sức để cho bạn biết khung mạng cho mỗi dll và exe trong đó


Cung cấp thông tin chi tiết tốt; đó là một ứng dụng dòng lệnh; bạn phải truyền cho nó tên thư mục trên dòng lệnh.
philu

2

" Phát hiện dễ dàng " còn được gọi là DiE là một chương trình để xác định loại tệp. Hoạt động với các tập tin dll hoặc các tập tin (.exe) khác. Tuyệt đối miễn phí cho sử dụng thương mại và phi thương mại.

nhập mô tả hình ảnh ở đây


0

Nếu bạn có DotPeektừ JetBrains, bạn có thể nhìn thấy nó trong Assembly Explorer.

Bạn có thể xem ảnh chụp màn hình này?  tôi không:(


0

Mở rộng các câu trả lời ở đây, điều này có thể nổ tung nếu có một hội đồng phụ thuộc. Nếu bạn may mắn và bạn biết người phụ thuộc ở đâu (hoặc thậm chí may mắn hơn, đó là trong GAC) thì điều này có thể giúp ...

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);
}

Tham khảo: https://weblog.west-wind.com/posts/2006/Dec/22/Reflection-on-Probols-Assemblies

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.