2008-11-28 9 views
75

मुझे एक निष्पादन योग्य फ़ाइल मिली है, और मैं जानना चाहता हूं कि .NET Framework के कौन से संस्करण इस फ़ाइल को प्रारंभ करने की आवश्यकता है।.NET Framework के किस संस्करण को निष्पादन योग्य चलाने की आवश्यकता है यह पता लगाने के लिए कैसे?

क्या इस जानकारी को कहीं और खोजने का कोई आसान तरीका है?

(अब तक मैं किसी भी भाग्य के बिना ILDASM और DUMPBIN की कोशिश की।)

+0

भी देखें http://stackoverflow.com/questions/3460982/determine-net-framework- संस्करण-के-डीएलएल? टैब = सबसे पुराना # टैब-टॉप –

उत्तर

49

मुझे लगता है कि सबसे करीब आप मज़बूती से प्राप्त कर सकते हैं निर्धारित करने के लिए क्या CLR के संस्करण की आवश्यकता है है। आप इसे आईएलडीएएसएमएम का उपयोग करके और "मैनिफ़ेस्ट" नोड या परावर्तक को देखकर और "एप्लिकेशन.एक्सई" नोड के आईएल के रूप में विसर्जित दृश्य को देखकर कर सकते हैं। दोनों मामलों में एक टिप्पणी है जो सीएलआर संस्करण को इंगित करती है। आईएलडीएएसएम में, टिप्पणी "// मेटाडाटा संस्करण" है और रिफ्लेक्टर में टिप्पणी "लक्ष्य रनटाइम संस्करण" है।

यहाँ WindowsFormsApplication1.exe नाम के एक नेट WinForms आवेदन के लिए उदाहरण हैं:

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 "प्रकट" नोड आंकड़ों को देखने का उपयोग:

.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 
} 

और सूचीबद्ध प्रत्येक संदर्भ के लिए परावर्तक का उपयोग कर, dissambly (अभी भी आईएल के रूप में) को देख:

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

तक उच्चतम संस्करण मेटाडेटा के साथ संदर्भ ढूंढना आप निर्धारित कर सकते हैं कि फ्रेमवर्क का कौन सा संस्करण आया था, जो इंगित करेगा कि आपको चलाने के लिए एप्लिकेशन के लिए स्थापित फ्रेमवर्क के समान संस्करण की आवश्यकता है। ऐसा कहा जा रहा है, मैं इसे 100% विश्वसनीय के रूप में नहीं मानूंगा, लेकिन मुझे नहीं लगता कि यह जल्द ही किसी भी समय बदल जाएगा।

+3

दुर्भाग्यवश माइक्रोसॉफ्ट उपर्युक्त तकनीक के लिए एक ब्रेकिंग बदलाव पेश करता है। .NET 4.5 असेंबली कच्चे .NET 4 पर नहीं चल सकते हैं, और एक .NET 4.5 असेंबली को बताने के लिए आपको सिस्टम को पढ़ने की आवश्यकता है। Runtime.Versioning.TargetFrameworkAttribute। http://www.lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html –

15

कोड से आप Assembly.ImageRuntimeVersion का उपयोग कर सकते हैं लेकिन फ़ाइल को देखकर शायद सबसे अच्छा काम करने के लिए परावर्तक का उपयोग करना होगा और देखें कि mscorlib का कौन सा संस्करण संदर्भित किया जा रहा है।

संपादित करें: और भी बेहतर, ildasm उपयोग करने के लिए अपने विधानसभा खोलें और फिर विधानसभा के लिए प्रकट देखने होगा। मैनिफेस्ट की पहली पंक्ति आपको सीएलआर के सटीक संस्करण बताएगी कि असेंबली के लिए बनाया गया था।

+0

यह गलत है। ओपी ने सीएलआर रनटाइम के संस्करण को नहीं, .NET Framework के संस्करण के बारे में पूछा। यह उत्तर बाद वाले को संबोधित करता है। उदाहरण के तौर पर, मैं फ्रेमवर्क 4.7.2531.0 के खिलाफ चल रहा हूं जो सीएलआर रनटाइम संस्करण 4.0.30139 का उपयोग करता है। ImageRuntimeVersion सीएलआर संस्करण देता है, फ्रेमवर्क संस्करण नहीं। –

23

dotPeek का उपयोग करने के लिए एक और अधिक सरल दृष्टिकोण होगा और देखें कि पेड़ में क्या दिखाई देता है। enter image description here

+1

बहुत अच्छा उपकरण, बस मुझे क्या चाहिए! – Surfbutler

+0

मैं क्या देख रहा हूं? –

+1

@BentTranberg मैंने एक स्क्रीन शॉट जोड़ा –

10

आप एक उपकरण CorFlags.exe कहा जाता है का उपयोग कर सकते हैं:

गुण पैनल देखें। यह .NET 2.0 के बाद से रहा है, और मुझे यकीन है कि यह विंडोज एसडीके 7.0 में शामिल है। डिफ़ॉल्ट रूप से (विंडोज एक्सपी प्रो पर) यह सी: \ प्रोग्राम फ़ाइलें \ माइक्रोसॉफ्ट एसडीके \ विंडोज \ v7.0A \ bin \ CorFlags.exe पर स्थापित है।इसे अपने हेडर जानकारी को प्रदर्शित करने के लिए किसी प्रबंधित मॉड्यूल (बिना किसी अन्य कमांड-लाइन फ़्लैग के) फ़ाइल पथ के साथ प्रदान करें, जिसमें संस्करण शामिल है।

ध्यान रखें कि यह उपयोगिता मॉड्यूल के पीई 32 हेडर को संशोधित करने के लिए डिज़ाइन की गई है, इसलिए जब तक आप documentation ध्यान से पढ़ते हैं तब तक किसी भी झंडे का उपयोग न करें।

+1

.Net4 और .Net4.5 – mheyman

2

या आप केवल सिस्टम का संदर्भ प्राप्त कर सकते हैं। इसके पास है। यह आपको बताएगा कि यह ऐप उपयोग कर रहा है .NET Framework संस्करण। 2.0 के लिए System.Core का संस्करण 2.0.xxx.xxx होगा। 3.5 के लिए संस्करण 3.5.xxx.xxx, आदि

+0

के बीच अंतर नहीं कर सकता मुझे नहीं लगता कि यह सच है। मेरे पास 4.5 का लक्ष्य ढांचा है लेकिन सिस्टम का उपयोग करें। कोर 4.0.XXX.XXX –

17

अब आप असेंबली के लक्ष्य ढांचे की जांच के लिए ILSpy का उपयोग कर सकते हैं। विधानसभा लोड करने के बाद, विधानसभा नोड की जड़ पर क्लिक करें और आप TargetFramework घोषणा के तहत जानकारी पा सकते हैं:

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

Notepad, तीन दशक पुराने का उपयोग करना, आकार में 200kb, पूर्वस्थापित उपकरण:

  • notepad appname.exe के साथ खुला आवेदन, शब्द "रूपरेखा" के लिए
  • खोज,
  • दोहराने पिछले .NET Framework,version=vX.Y तक F3 साथ खोज
  • दिखाता है
  • यदि कुछ भी नहीं मिला (3.0 से नीचे संस्करण) v2. के लिए खोजें ... अभी भी 100 गुना आसान है, तो डॉट नेट विश्लेषक उपकरण और कचरा स्टूडियो के गीगाबाइट इंस्टॉल करना।

किसी भी अन्य संपादक/दर्शक बाइनरी भी नोटपैड की तरह या खोल सकते हैं, ++ totalCommander के महान पाठ/हेक्स दर्शक lister

+0

यह अब तक का सबसे अच्छा जवाब है। धन्यवाद! – kjrkvc

+0

@kjrkvc के साथ सहमत हैं, यह वास्तव में सबसे अच्छा – Bodhi

+2

उत्कृष्ट उत्तर है, और अब तक सबसे आसान है - हालांकि मैं इसके लिए नोटपैड ++ का उपयोग करूंगा :) – harag

5

कमांड लाइन से: find "Framework" MyApp.exe

0

लिनक्स/OSX/यूनिक्स पर आप उपयोग कर सकते हैं:

strings that_app.exe | grep 'v2.\|Framework'