กำหนดเวอร์ชัน. NET Framework สำหรับ dll


139

ฉันมี dll เก่าที่คอมไพล์กับ. NET framework และปรับใช้ ฉันไม่แน่ใจว่าจะคอมไพล์เฟรมเวิร์ก. NET เวอร์ชันใด ฉันสงสัยว่าฉันจะทราบได้อย่างไรว่าเวอร์ชันใดของ. NET framework นี้ถูกคอมไพล์กับ dll? ฉันไม่สามารถเชื่อถือซอร์สโค้ดได้เนื่องจากฉันเชื่อว่าได้รับการอัปเกรดเป็น Visual Studio 2008 และเปลี่ยนเป็น. NET framework เวอร์ชัน 3.5 แล้ว


คำตอบ:


50

โหลดลงในReflectorแล้วดูว่าอ้างอิงอะไร?

ตัวอย่างเช่น:

ป้อนคำอธิบายภาพที่นี่


1
ความคิดของฉันก็เช่นกัน แต่เมื่อรู้ว่าตัวสะท้อนแสงมันอาจจะบ่นและให้ไอคอนข้อผิดพลาดที่ไม่ต้องบรรยาย
leppie

@leppie ไม่ควรมีปัญหาแม้ว่าจะเป็น. NET 1.1 ก็ตาม เพียงแค่เปลี่ยนรายการประกอบเริ่มต้นของคุณ
ParmesanCodice

คำตอบของคุณมีประโยชน์มาก แต่ฉันไม่แนะนำให้ใช้มันสุ่มสี่สุ่มห้า - เมื่อวานนี้ฉันใช้เวลามากเกินไปในโครงการของตัวเองซึ่งกำหนดเป้าหมายไว้สำหรับ. Net 4.0 ซึ่งรายงานโดย Reflector เพื่อใช้. Net 4.0.3 และจำเป็นต้องใช้ .Net 4.5 โดย Windows :-) ฉันไม่รู้วิธีการใด ๆ ในการตรวจสอบสิ่งนี้ในโครงการอื่นที่ไม่ใช่แหล่งที่มา - ดูที่นี่: stackoverflow.com/questions/13214503/…
greenoldman

3
นอกจากนี้คุณยังสามารถใช้ฟรีเปิดแหล่งทางเลือกILSpyเป็นข้อสังเกตโดยแคทรุยซ์ลิม
Marcus Mangelsdorf

คำตอบนี้ทำงานให้ฉัน: stackoverflow.com/a/3461027/2961177
ckkkitty

132

ใน PowerShell คุณสามารถใช้สิ่งต่อไปนี้เพื่อรับรันไทม์เป้าหมาย:

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

ผมดัดแปลงมานี้เพื่อ PowerShell จากคำตอบของเบน Griswold

ถ้าคุณต้องการทราบเวอร์ชันของกรอบเป้าหมายที่ระบุใน Visual Studio ให้ใช้:

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

คุณควรจะได้รับสิ่งที่ต้องการ

.NETFramework เวอร์ชัน = v4.5.2


4
คำตอบนี้เป็นประโยชน์มากที่สุด ระบบปฏิบัติการ Windows ทั้งหมดหลังปี 2003 รองรับ Powershell เชลล์ให้ข้อเสนอแนะทันทีโดยไม่ต้องการการสนับสนุนแอปพลิเคชันเพิ่มเติมตามที่คำตอบอื่น ๆ แนะนำ เหมาะสำหรับการตรวจสอบ dll แบบ "เพียงครั้งเดียว" คุณคือผู้ชาย @swoogan
Nathan McCoy

1
ฉันทำสิ่งนี้สำหรับ DLL ที่ฉันสร้างด้วย TargetFrameworkVersion ของ v3.5 และส่งคืน v2.0.50727 ฉันขาดอะไรไป?
BHSPitMonkey

5
@BHSPitMonkey มีรันไทม์เพียง 4 เวอร์ชันเท่านั้น: 1.0, 1.1, 2.0 และ 4.0 .NET 3.0 และ 3.5 คอมไพล์เป็น CLR เวอร์ชัน 2.0 msdn.microsoft.com/en-us/library/bb822049(v=vs.110).aspx
Swoogan

1
สคริปต์นี้มีเฉพาะ RuntimeVersion เท่านั้นคำถามเกี่ยวกับ TargetFrameworkversion อย่างมีประสิทธิภาพสำหรับแอสเซมบลีทั้งหมดที่คอมไพล์กับ 2.0,3.0,3.5 สคริปต์นี้แสดงเวอร์ชันรันไทม์เป็น 2.0.0.0
Kiran Vedula

3
สำหรับฉัน ReflectionOnlyLoadFrom ส่งคืน ImageRuntimeVersion แต่เป็นศูนย์ CustomAttributes การใช้ LoadFrom แทน ReflectionOnlyLoadFrom จะให้ผลลัพธ์ที่คาดหวัง เหตุผลใด? PSVersion 5.1.16299.251 CLRVersion 4.0.30319.42000
Bernard Vander Beken

70

dotPeekเป็นเครื่องมือที่ยอดเยี่ยม (ฟรี) ในการแสดงข้อมูลนี้

หากคุณมีปัญหาบางอย่างในการจับ Reflector นี่เป็นทางเลือกที่ดี

ป้อนคำอธิบายภาพที่นี่


4
FYI ฉันเปลี่ยนจาก DotPeek เป็น JustDecompile เนื่องจากปัญหาหนึ่ง: หากคุณเลือก "specific version = false" DotPeek จะแสดงเวอร์ชันว่างเปล่าและ JustDecompile จะแสดงเวอร์ชันที่ถูกต้อง ทำให้มันคุ้มค่าที่จะเปลี่ยนสำหรับฉัน
ashes999

เยี่ยมมาก - ทำในสิ่งที่ฉันต้องการโดยไม่ต้องติดตั้งตัวทดลองสำหรับ Reflector
bernhardrusch

50

คุณสามารถใช้ILDASM ...

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

และตรวจสอบ 'ส่วนข้อมูลเมตา' ในผลลัพธ์ มันจะเป็นดังนี้:

ส่วนข้อมูลเมตา: 0x424a5342, เวอร์ชัน: 1.1, พิเศษ: 0, เวอร์ชัน len: 12, เวอร์ชัน: v4.0.30319

แท็ก 'version' จะบอกคุณถึงเวอร์ชัน. NET Framework ในตัวอย่างข้างต้นคือ 4.0.30319


3
ฉันกำลังมองหาอะไรที่นี่? นี่หมายถึง. NET 4.0 หรือไม่ // Metadata section: 0x424a5342, version: 1.1, extra: 0, version len: 12, versio n: v4.0.30319
PeterX

ใช่สำหรับ. NET 2 ฉันได้รับสิ่งต่อไปนี้: // ส่วนข้อมูลเมตา: 0x424a5342, เวอร์ชัน: 1.1, พิเศษ: 0, เวอร์ชัน len: 12, เวอร์ชัน: v2.0.50727
Simon


17

คุณมีตัวเลือกไม่กี่ทาง: ในการรับมันโดยทางโปรแกรมจากโค้ดที่มีการจัดการให้ใช้ Assembly.ImageRuntimeVersion:

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

จากบรรทัดคำสั่งเริ่มต้นใน v2.0 ildasm.exe จะแสดงหากคุณดับเบิลคลิกที่ "MANIFEST" และมองหา "เวอร์ชันข้อมูลเมตา" การกำหนดเวอร์ชัน CLR ของรูปภาพ


วิธีรับ ImageRuntimeVersion สำหรับ CurrentAppDomain
Kiquenet

15

เพียงแค่

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

1
ฉันไม่รู้ว่าทำไมสิ่งนี้จึงถูกลดลง แต่ฉันสามารถเรียกใช้ snippet ได้ (จำเป็นต้องมีการอ้างอิงถึง System.Runtime.Versioning) และรับผลลัพธ์สำเร็จ (ซึ่งมาจาก LINQPad): TypeId typeof (TargetFrameworkAttribute) FrameworkName .NETFramework, เวอร์ชัน = v4.0 FrameworkDisplayName .NET Framework 4
Sudhanshu Mishra

โค้ดนี้ไม่ดึงข้อมูลเวอร์ชันเต็มของเฟรมเวิร์ก "4.0" เป็นสิ่งที่ควรรู้ แต่ "v4.0.30319" จะมีประโยชน์มากกว่าหากคุณกำลังพยายามเข้า RegAsm.exe ข้อมูลเวอร์ชันที่สมบูรณ์ยิ่งขึ้นสามารถพบได้ใน: string tar = Assembly.LoadFrom (@ "myAssembly.dll") ImageRuntimeVersion;
Martin

นี่ดูเหมือนเป็นแนวทางที่ถูกต้องมีสถานการณ์ใดบ้างที่แอสเซมบลีอาจไม่ได้ใช้แอตทริบิวต์นี้? ฉันได้ทดสอบกับแอสเซมบลี. NET Core และรายงาน netcore และหมายเลขเวอร์ชันอย่างถูกต้อง
Adam Naylor

สิ่งนี้ไม่ได้ผลสำหรับฉัน ไม่ได้GetCustomAttributes TargetFrameworkAttributeแต่ ImageRuntimeVersion ทำงานได้ดีแม้ว่าจะดึง CLR ที่ถูกต้องที่ไบนารีสร้างขึ้น ฉันต้องการเวอร์ชันเฟรมเวิร์กเป้าหมายที่สร้างขึ้น
Shameel Mohamed

13

อีกทางเลือกหนึ่งผ่าน Visual Studio เพิ่มการอ้างอิงไปยัง DLL ไปยังโครงการใด ๆ จากนั้นคลิกขวาที่ข้อมูลอ้างอิงใหม่และคลิกคุณสมบัติคุณจะเห็นสิ่งที่คุณกำลังมองหาในเวอร์ชันรันไทม์:

ป้อนคำอธิบายภาพที่นี่


ฉันคิดว่าคำถามนี้ไม่ได้ถามเกี่ยวกับเวลาที่มีการอ้างอิง DLL ใน Visual Studio แต่มี DLL ของ. NET ที่คุณพบว่านอนอยู่บนพีซีของคุณ
ashes999

7
คำตอบนี้บ่งชี้ว่าคุณสามารถเพิ่มการอ้างอิงถึง ol '.NET DLL ใด ๆ ที่คุณพบอยู่บนพีซีของคุณและหนึ่งในคุณสมบัติของรายการภายใต้การอ้างอิงที่สอดคล้องกับ DLL นั้นคือ "เวอร์ชันรันไทม์"
ALEXintlsos

8

ถอดรหัสด้วย ILDASM และดูเวอร์ชันของ mscorlib ที่อ้างอิง (ควรอยู่ด้านบนสุด)


6

วิธีที่ง่ายที่สุด: เพียงแค่เปิด. dll ในโปรแกรมแก้ไขข้อความใดก็ได้ ดูหนึ่งในบรรทัดสุดท้าย: ป้อนคำอธิบายภาพที่นี่


ตัวเลือกที่ดีที่สุด
Sisir

2
อย่างไรก็ตามสิ่งนี้ใช้ไม่ได้กับ dlls ที่สร้างขึ้นก่อน. Net 3.0
Sisir

2

ฉันเขียนแอปคอนโซล C # นี้อย่างรวดเร็วเพื่อทำสิ่งนี้:

https://github.com/stuartjsmith/binarydetailer

เพียงแค่ส่งไดเรกทอรีเป็นพารามิเตอร์และจะพยายามอย่างดีที่สุดเพื่อบอกคุณถึง net framework สำหรับแต่ละ dll และ exe ในนั้น


ให้ข้อมูลรายละเอียดที่ดี มันเป็นแอพบรรทัดคำสั่ง คุณต้องส่งชื่อไดเร็กทอรีบนบรรทัดคำสั่ง
philu

2

" Detect It Easy " หรือที่เรียกว่า DiE เป็นโปรแกรมสำหรับกำหนดประเภทของไฟล์ ทำงานกับไฟล์. dll หรือไฟล์ (.exe) อื่น ๆ ฟรีแน่นอนสำหรับการใช้งานเชิงพาณิชย์และไม่ใช่เชิงพาณิชย์

ป้อนคำอธิบายภาพที่นี่



0

การขยายคำตอบที่นี่สิ่งนี้สามารถระเบิดได้หากมีชุดประกอบที่ขึ้นอยู่ หากคุณโชคดีและคุณรู้ว่าที่พึ่งอยู่ที่ไหน (หรือโชคดีกว่านั้นก็อยู่ใน GAC) สิ่งนี้อาจช่วยได้ ...

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

อ้างอิง: https://weblog.west-wind.com/posts/2006/Dec/22/Reflection-on-Problem-Assemblies

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