จะทราบได้อย่างไรว่า. 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.