कैसे पता करें कि .NET फ्रेमवर्क के किस संस्करण को चलाने के लिए एक निष्पादन योग्य आवश्यकता है?


97

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

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

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



docs.microsoft.com/en-us/sysinternals/downloads - प्रोसेस एक्सप्लोरर करता है बहुत अच्छी तरह से और आसानी से उपयोग करने के लिए, बस इसे व्यवस्थापक के रूप में चलाने
AquaAlex

जवाबों:


55

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

यहां .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 "मैनिफ़ेस्ट" नोड डेटा को देखकर:

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

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

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

उच्चतम संस्करण मेटाडेटा के साथ संदर्भ ढूंढकर आप यह निर्धारित कर सकते हैं कि संदर्भ से आया फ्रेमवर्क का कौन सा संस्करण है, जो यह संकेत देगा कि आपको चलाने के लिए एप्लिकेशन के लिए स्थापित फ्रेमवर्क के समान संस्करण की आवश्यकता है। यह कहा जा रहा है, मैं इसे 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

56

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

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

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


यह बहुत अच्छा है- खासकर यदि आपके पास डिकॉम्पाइल / अन्य टूल्स तक पहुंच नहीं है
क्रेग

@BentTranberg दिलचस्प है, क्या आप मुझे किसी तरह से exe भेज सकते हैं, gmail com पर asainnp।
असैन कुजोविक


22

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

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

2
ध्यान दें कि TargetFrameworkAttribute केवल .NET 4.0 में जोड़ा गया था, इसलिए .NET 3.5 या इससे पहले संकलित असेंबली पर मौजूद नहीं होगा।
वाई हा ली

ILSpy लोड असेंबली रूट नोड पर क्लिक करते समय टिप्पणियों में "रनटाइम: vXXX" दिखाता है। मैं एक v1.1.4322 रूपरेखा परियोजना को देखने में सक्षम था।
ryancdotnet

15

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

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


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

11

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

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


2
.Net4 और .Net4.5 के बीच अंतर नहीं कर सकते
mheyman


2

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


मुझे नहीं लगता कि यह सच है। मेरे पास 4.5 का लक्ष्य ढाँचा है, लेकिन System.Core 4.0.XXX.XXX का उपयोग करें
पॉल

2

आप Powershell का उपयोग करके Windows में किसी फ़ाइल का .NET संस्करण प्राप्त कर सकते हैं। निम्नलिखित लिपि;

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

निम्नलिखित परिणाम प्रदान करता है; यहां छवि विवरण दर्ज करें

ध्यान दें कि परिणाम उस फ़ोल्डर में exe फ़ाइलों के लिए .NET संस्करण निकाले, लेकिन यह एक dll के लिए भी ऐसा ही करेगा।


1

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

strings that_app.exe | grep 'v2.\|Framework'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.