จะทราบได้อย่างไรว่า. NET Framework เวอร์ชันใดที่สามารถเรียกใช้งานได้


98

ฉันมีไฟล์ปฏิบัติการและฉันต้องการทราบว่าไฟล์นี้ต้องเริ่มใช้งาน. NET framework เวอร์ชันใด

มีวิธีง่ายๆในการค้นหาข้อมูลนี้หรือไม่?

(จนถึงตอนนี้ฉันลองใช้ILDASMและDUMPBINโดยไม่มีโชค)



docs.microsoft.com/en-us/sysinternals/downloads - Process Explorer ทำได้ดีมากและใช้งานง่ายเพียงแค่เรียกใช้ในฐานะผู้ดูแลระบบ
— AquaAlex

คำตอบ:


55

ฉันคิดว่าสิ่งที่ใกล้เคียงที่สุดที่คุณสามารถทำได้อย่างน่าเชื่อถือคือการกำหนดว่าต้องใช้CLRเวอร์ชันใด คุณสามารถทำได้โดยใช้ ILDASM และดูที่โหนด "MANIFEST" หรือตัวสะท้อนแสงและดูที่มุมมองการแยกชิ้นส่วนของโหนด "Application.exe" เป็น IL ในทั้งสองกรณีมีข้อคิดเห็นที่ระบุเวอร์ชัน CLR ใน ILDASM ข้อคิดเห็นคือ "// Metadata version" และใน Reflector ความคิดเห็นคือ "Target Runtime Version"

นี่คือตัวอย่างสำหรับแอปพลิเคชัน. NET WinForms ที่ชื่อ 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
}

ตัวสะท้อนแสง:

.module WindowsFormsApplication1.exe
.subsystem 0x0002
// MVID: {CA3D2090-16C5-4899-953E-4736D6BC0FA8}
// Target Runtime Version: v2.0.50727

คุณยังสามารถดูรายการแอสเซมบลีที่อ้างอิงและมองหาข้อมูลอ้างอิงที่มีหมายเลขเวอร์ชันสูงสุด

อีกครั้งโดยใช้ ILDASM เพื่อดูข้อมูลโหนด "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
}

และใช้ตัวสะท้อนแสงดูที่ไม่เหมือนกัน (ยังคงเป็น IL) สำหรับการอ้างอิงแต่ละรายการที่ระบุไว้:

.assembly extern System.Core
{
    .ver 3:5:0:0
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}

เมื่อค้นหาการอ้างอิงที่มีข้อมูลเมตาเวอร์ชันสูงสุดคุณสามารถระบุได้ว่า Framework ที่อ้างอิงนั้นมาจากเวอร์ชันใดซึ่งจะบ่งชี้ว่าคุณต้องการ Framework เวอร์ชันเดียวกันที่ติดตั้งเพื่อให้แอปพลิเคชันทำงาน ดังที่กล่าวมาฉันจะไม่ถือว่าสิ่งนี้เชื่อถือได้ 100% แต่ฉันไม่คิดว่ามันจะเปลี่ยนแปลงเร็ว ๆ นี้


4
น่าเสียดายที่ Microsoft แนะนำการเปลี่ยนแปลงครั้งใหญ่สำหรับเทคนิคข้างต้น แอสเซมบลี. NET 4.5 ไม่สามารถรันบน. NET 4 แบบดิบและหากต้องการบอกแอสเซมบลี. NET 4.5 คุณต้องอ่าน System.Runtime.Versioning.TargetFrameworkAttribute ด้วย lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html
— Lex Li

58

ใช้Notepadอายุสามทศวรรษขนาด 200kb เครื่องมือที่ติดตั้งไว้ล่วงหน้า:

  • แอพลิเคชันที่เปิดกับnotepad appname.exe,
  • ค้นหาคำว่า "framework"
  • ค้นหาครั้งสุดท้ายซ้ำF3จนกว่าจะ.NET Framework,version=vX.Yปรากฏขึ้น
  • หากไม่พบสิ่งใด (เวอร์ชันต่ำกว่า 3.0) ให้ค้นหาv2.... ยังง่ายกว่า 100 เท่าจากนั้นติดตั้งเครื่องมือวิเคราะห์ดอทเน็ตและสตูดิโอขยะขนาดกิกะไบต์

อื่น ๆ บรรณาธิการ / ผู้ชมสามารถเปิดไบนารีเกินไปเช่น Notepad ++ หรือข้อความที่ดีของ totalCommander / hex โปรแกรมดูลิสเตอร์


นี่เป็นสิ่งที่ยอดเยี่ยมโดยเฉพาะอย่างยิ่งหากคุณไม่สามารถเข้าถึงโปรแกรมถอดรหัส / เครื่องมืออื่น ๆ ได้
— Craig

@BentTranberg น่าสนใจช่วยส่ง exe หน่อยได้ไหม asainnp ที่ gmail com
— Asain Kujovic


22

ตอนนี้คุณสามารถใช้ILSpyเพื่อตรวจสอบกรอบเป้าหมายของแอสเซมบลี หลังจากโหลดแอสเซมบลีคลิกที่รูทของโหนดแอสเซมบลีและคุณจะพบข้อมูลภายใต้การประกาศ TargetFramework:

[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]

2
โปรดทราบว่าTargetFrameworkAttributeถูกเพิ่มใน. NET 4.0 เท่านั้นดังนั้นจะไม่มีอยู่ในแอสเซมบลีที่คอมไพล์กับ. NET 3.5 หรือรุ่นก่อนหน้า
— Wai Ha Lee

ILSpy แสดง "Runtime: vXXX" ในข้อคิดเห็นเมื่อคลิกที่โหนดรากของแอสเซมบลีที่โหลด ฉันสามารถเห็นโครงการกรอบ v1.1.4322
— ryancdotnet

15

จากรหัสคุณสามารถใช้ได้Assembly.ImageRuntimeVersionแต่การดูไฟล์อาจเป็นสิ่งที่ดีที่สุดที่ควรทำคือใช้ตัวสะท้อนแสงและดูว่าเวอร์ชันใดmscorlibมีการอ้างอิงใด

แก้ไข: ยิ่งไปกว่านั้นคือการใช้ildasmเปิดแอสเซมบลีของคุณแล้วดูรายการสำหรับแอสเซมบลี บรรทัดแรกของไฟล์ Manifest จะบอกเวอร์ชันที่แน่นอนของ CLR ที่แอสเซมบลีสร้างขึ้น


3
นี่เป็นสิ่งที่ไม่ถูกต้อง OP ถามเกี่ยวกับเวอร์ชันของ. NET Framework ไม่ใช่เวอร์ชันของ CLR Runtime คำตอบนี้อยู่ที่หลัง ตัวอย่างเช่นฉันกำลังทำงานกับ Framework 4.7.2531.0 ซึ่งใช้ CLR Runtime เวอร์ชัน 4.0.30139 ImageRuntimeVersion ส่งคืนเวอร์ชัน CLR ไม่ใช่เวอร์ชัน Framework
— Tom Baxter


11

คุณสามารถใช้เครื่องมือที่ชื่อว่า CorFlags.exe มีมาตั้งแต่. NET 2.0 แล้วและฉันรู้แน่นอนว่ามันรวมอยู่ใน Windows SDK 7.0 โดยค่าเริ่มต้น (บน Windows XP Pro) จะติดตั้งไว้ใน C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe จัดเตรียมพา ธ ไฟล์ไปยังโมดูลที่มีการจัดการ (โดยไม่มีแฟล็กบรรทัดคำสั่งอื่น ๆ ) เพื่อแสดงข้อมูลส่วนหัวซึ่งรวมถึงเวอร์ชัน

โปรดทราบว่ายูทิลิตี้นี้ออกแบบมาเพื่อแก้ไขส่วนหัว PE32 ของโมดูลดังนั้นอย่าใช้แฟล็กใด ๆ จนกว่าคุณจะอ่านเอกสารอย่างละเอียด


2
ไม่สามารถแยกความแตกต่างระหว่าง. Net4 และ. Net4.5
— mheyman

3

คุณสามารถรับไฟล์เวอร์ชัน. NET ใน Windows โดยใช้ Powershell สคริปต์ต่อไปนี้;

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

ให้ผลลัพธ์ดังต่อไปนี้ ป้อนคำอธิบายภาพที่นี่

โปรดทราบว่าผลลัพธ์จะแตกไฟล์เวอร์ชัน. NET สำหรับไฟล์ exe ในโฟลเดอร์นั้น แต่จะทำเช่นเดียวกันสำหรับ dll


2

หรือคุณสามารถค้นหาข้อมูลอ้างอิงของ System.Core ได้ ที่จะบอกคุณว่า. NET Framework เวอร์ชันที่แอปนี้ใช้อยู่ สำหรับ 2.0 เวอร์ชันของ System.Core จะเป็น 2.0.xxx.xxx สำหรับ 3.5 เวอร์ชันจะเป็น 3.5.xxx.xxx เป็นต้น


ฉันไม่คิดว่านี่เป็นเรื่องจริง ฉันมีกรอบเป้าหมายที่ 4.5 แต่ใช้ System.Core 4.0.XXX.XXX
— Paul Totzke

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.