मुझे एक निष्पादन योग्य फ़ाइल मिल गई है, और मैं जानना चाहूंगा कि .NET फ़ाइल के कौन से संस्करण इस फ़ाइल को शुरू करने की आवश्यकता है।
क्या यह जानकारी खोजने का कोई आसान तरीका है?
(अब तक मैंने बिना किसी भाग्य के ILDASM और DUMPBIN की कोशिश की ।)
जवाबों:
मुझे लगता है कि आप निकटतम रूप से प्राप्त कर सकते हैं यह निर्धारित करने के लिए कि सीएलआर के किस संस्करण की आवश्यकता है। आप 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% विश्वसनीय नहीं मानूंगा, लेकिन मुझे नहीं लगता कि यह जल्द ही बदल जाएगा।
नोटपैड का उपयोग करते हुए , तीन दशक पुराना, आकार में 200kb, पूर्वस्थापित उपकरण:
notepad appname.exe
, F3
तक अंतिम खोज दोहराएं.NET Framework,version=vX.Y
v2.
... अभी भी 100 गुना आसान है तो डॉट नेट विश्लेषक उपकरण और कचरा स्टूडियो की गीगाबाइट स्थापित करना।कोई भी अन्य संपादक / दर्शक बायनेरी भी खोल सकता है, जैसे कि नोटपैड ++ या कुलकेंडर के महान पाठ / हेक्स दर्शक लिस्टर ।
अब आप ILSpy का उपयोग किसी असेंबली के लक्ष्य ढांचे की जांच करने के लिए कर सकते हैं । असेंबली लोड करने के बाद, असेंबली नोड की जड़ पर क्लिक करें, और आप टारगेटफ्रॉमवर्क घोषणा के तहत जानकारी पा सकते हैं:
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
कोड से आप उपयोग कर सकते हैं, Assembly.ImageRuntimeVersion
लेकिन फ़ाइल को देखकर शायद सबसे अच्छी बात यह होगी कि रिफ्लेक्टर का उपयोग करें और देखें कि किस संस्करण को mscorlib
संदर्भित किया जा रहा है।
संपादित करें: बेहतर होगा कि आप ildasm का उपयोग करें , अपनी असेंबली खोलें और फिर असेंबली के लिए प्रदर्शन देखें। प्रकट की पहली पंक्ति आपको सीएलआर का सटीक संस्करण बताएगी जिसे विधानसभा के लिए बनाया गया था।
आप CorFlags.exe नामक टूल का उपयोग कर सकते हैं। यह .NET 2.0 के बाद से आसपास है, और मुझे पता है कि यह विंडोज एसडीके 7.0 में शामिल है। डिफ़ॉल्ट रूप से (Windows XP Pro पर) यह C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe पर स्थापित है। इसकी हेडर जानकारी प्रदर्शित करने के लिए इसे प्रबंधित मॉड्यूल (किसी भी अन्य कमांड-लाइन झंडे के बिना) के फ़ाइल पथ के साथ प्रदान करें, जिसमें संस्करण भी शामिल है।
ध्यान रखें कि यह उपयोगिता एक मॉड्यूल के PE32 हेडर को संशोधित करने के लिए डिज़ाइन की गई है, इसलिए जब तक आप दस्तावेज़ को ध्यान से पढ़ें, तब तक किसी भी झंडे का उपयोग न करें ।
या आप यह पता कर सकते हैं कि System.Core का कौन सा संदर्भ है। यह आपको .NET फ्रेमवर्क संस्करण बताएगा जो इस ऐप का उपयोग कर रहा है। 2.0 के लिए System.Core का संस्करण 2.0.xxx.xxx होगा। 3.5 के लिए संस्करण 3.5.xxx.xxx, आदि होगा।
आप 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 के लिए भी ऐसा ही करेगा।