ฉันมีไฟล์ปฏิบัติการและฉันต้องการทราบว่าไฟล์นี้ต้องเริ่มใช้งาน. NET framework เวอร์ชันใด
มีวิธีง่ายๆในการค้นหาข้อมูลนี้หรือไม่?
คำตอบ:
ฉันคิดว่าสิ่งที่ใกล้เคียงที่สุดที่คุณสามารถทำได้อย่างน่าเชื่อถือคือการกำหนดว่าต้องใช้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% แต่ฉันไม่คิดว่ามันจะเปลี่ยนแปลงเร็ว ๆ นี้
ใช้Notepadอายุสามทศวรรษขนาด 200kb เครื่องมือที่ติดตั้งไว้ล่วงหน้า:
notepad appname.exe
, F3
จนกว่าจะ.NET Framework,version=vX.Y
ปรากฏขึ้นv2.
... ยังง่ายกว่า 100 เท่าจากนั้นติดตั้งเครื่องมือวิเคราะห์ดอทเน็ตและสตูดิโอขยะขนาดกิกะไบต์อื่น ๆ บรรณาธิการ / ผู้ชมสามารถเปิดไบนารีเกินไปเช่น Notepad ++ หรือข้อความที่ดีของ totalCommander / hex โปรแกรมดูลิสเตอร์
วิธีที่ง่ายกว่านั้นคือการใช้dotPeekและดูว่ามีอะไรปรากฏในแผนภูมิ
ตอนนี้คุณสามารถใช้ILSpyเพื่อตรวจสอบกรอบเป้าหมายของแอสเซมบลี หลังจากโหลดแอสเซมบลีคลิกที่รูทของโหนดแอสเซมบลีและคุณจะพบข้อมูลภายใต้การประกาศ TargetFramework:
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
จากรหัสคุณสามารถใช้ได้Assembly.ImageRuntimeVersion
แต่การดูไฟล์อาจเป็นสิ่งที่ดีที่สุดที่ควรทำคือใช้ตัวสะท้อนแสงและดูว่าเวอร์ชันใดmscorlib
มีการอ้างอิงใด
แก้ไข: ยิ่งไปกว่านั้นคือการใช้ildasmเปิดแอสเซมบลีของคุณแล้วดูรายการสำหรับแอสเซมบลี บรรทัดแรกของไฟล์ Manifest จะบอกเวอร์ชันที่แน่นอนของ CLR ที่แอสเซมบลีสร้างขึ้น
จากบรรทัดคำสั่ง: find "Framework" MyApp.exe
คุณสามารถใช้เครื่องมือที่ชื่อว่า CorFlags.exe มีมาตั้งแต่. NET 2.0 แล้วและฉันรู้แน่นอนว่ามันรวมอยู่ใน Windows SDK 7.0 โดยค่าเริ่มต้น (บน Windows XP Pro) จะติดตั้งไว้ใน C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe จัดเตรียมพา ธ ไฟล์ไปยังโมดูลที่มีการจัดการ (โดยไม่มีแฟล็กบรรทัดคำสั่งอื่น ๆ ) เพื่อแสดงข้อมูลส่วนหัวซึ่งรวมถึงเวอร์ชัน
โปรดทราบว่ายูทิลิตี้นี้ออกแบบมาเพื่อแก้ไขส่วนหัว PE32 ของโมดูลดังนั้นอย่าใช้แฟล็กใด ๆ จนกว่าคุณจะอ่านเอกสารอย่างละเอียด
คุณสามารถรับไฟล์เวอร์ชัน. 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
หรือคุณสามารถค้นหาข้อมูลอ้างอิงของ System.Core ได้ ที่จะบอกคุณว่า. NET Framework เวอร์ชันที่แอปนี้ใช้อยู่ สำหรับ 2.0 เวอร์ชันของ System.Core จะเป็น 2.0.xxx.xxx สำหรับ 3.5 เวอร์ชันจะเป็น 3.5.xxx.xxx เป็นต้น
บน Linux / OSX / unix คุณสามารถใช้:
strings that_app.exe | grep 'v2.\|Framework'