Dll के लिए .NET फ्रेमवर्क संस्करण का निर्धारण करें


137

मेरे पास एक पुराना dll है जो .NET फ्रेमवर्क के खिलाफ संकलित किया गया था और तैनात किया गया था। मुझे यकीन नहीं है कि .NET फ्रेमवर्क के किस संस्करण को इसके खिलाफ संकलित किया गया था। मैं सोच रहा हूं कि मैं कैसे तय कर सकता हूं कि इस dll के .NET फ्रेमवर्क के किस संस्करण के खिलाफ संकलित किया गया था? मैं सोर्स कोड पर भरोसा नहीं कर सकता क्योंकि मेरा मानना ​​है कि इसे विजुअल स्टूडियो 2008 में अपग्रेड किया गया है और इसे .NET फ्रेमवर्क वर्जन 3.5 में बदल दिया गया है।


जवाबों:


49

इसे रिफ्लेक्टर में लोड करें और देखें कि यह क्या संदर्भ देता है?

उदाहरण के लिए:

यहां छवि विवरण दर्ज करें


1
मेरा विचार भी, लेकिन परावर्तक को जानने के बाद, यह शायद शिकायत करेगा, और इसे एक अच्छा गैर-विवरण त्रुटि आइकन देगा।
लीपी

@ .ppie समस्या नहीं होनी चाहिए, भले ही यह .NET 1.1 हो। बस अपनी डिफ़ॉल्ट विधानसभा सूची बदलें।
परमेसनकोड

आपका उत्तर बहुत मददगार है, लेकिन मैं सलाह देता हूं कि इस पर आंख मूंदकर भरोसा न करें- कल मैंने अपने ही प्रोजेक्ट पर बहुत अधिक समय खर्च किया है। नेट 4.0 के लिए लक्षित किया गया था, रिफ्लेक्टर द्वारा .Net 4.0.3 का उपयोग करने की सूचना दी गई, और उपयोग करने की आवश्यकता थी। .Net 4.5 by Windows :-) मुझे प्रोजेक्ट के अलावा अन्य स्रोतों के साथ इसे सत्यापित करने की कोई विधि नहीं है - यहाँ देखें: stackoverflow.com/questions/13214503/…
greenoldman

3
तुम भी मुक्त, खुला स्रोत विकल्प का उपयोग कर सकते ILSpy के रूप में उल्लेख किया कैट लिम Ruiz द्वारा।
मार्कस मैंगल्सडॉर्फ

इस जवाब ने मेरे लिए काम किया: stackoverflow.com/a/3461027/2961177
ckkkitty

128

PowerShell में आप लक्ष्य रनटाइम प्राप्त करने के लिए निम्नलिखित का उपयोग कर सकते हैं:

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

मैंने बेन ग्रिसवॉल्ड के जवाब से इसे पॉवरशेल में बदल दिया

यदि आप 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
यह उत्तर सबसे ज्यादा मददगार है। 2003 के बाद सभी विंडोज ओएस पॉवरशेल का समर्थन करते हैं। एक शेल तत्काल प्रतिक्रिया देता है, जिसमें किसी भी अतिरिक्त आवेदन समर्थन की आवश्यकता नहीं होती है क्योंकि अन्य उत्तर सुझाते हैं। एक dll के "वन ऑफ़" चेक के लिए बढ़िया। आप आदमी हैं @swoogan।
नाथन मैककॉय

1
मैंने यह एक DLL के लिए किया था जिसे मैंने v3.5 के TargetFrameworkVersion के साथ बनाया था, और यह v2.0.50727 लौटा। मैं क्या खो रहा हूँ?
BHSPitMonkey

4
@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 के रूप में रनटाइम संस्करण को दिखाती है
किरण वेदुला

3
मेरे लिए ReflectionOnlyLoadFrom ImageRuntimeVersion, लेकिन शून्य CustomAttributes लौटाता है। ReflectionOnlyLoadFrom के बजाय LoadFrom का उपयोग अपेक्षित परिणाम देता है। कोई कारण? PSVersion 5.1.16299.251 CLRVersion 4.0.30319.42000
बर्नार्ड वेन्डर बीकन

69

इस जानकारी को दिखाने के लिए dotPeek एक बेहतरीन (फ्री) टूल है।

यदि आप रिफ्लेक्टर की कुछ समस्याओं को पकड़ रहे हैं तो यह एक अच्छा विकल्प है।

यहां छवि विवरण दर्ज करें


4
FYI करें, मैंने एक मुद्दे के कारण DotPeek से JustDecompile पर स्विच किया: यदि आप "विशिष्ट संस्करण = गलत," का चयन करते हैं, तो DotPeek ने एक खाली संस्करण दिखाया, और JustDecompile सही संस्करण दिखाता है। इसे मेरे लिए स्विच करने लायक बनाया।
ashes999

महान - बिल्कुल वैसा ही किया जैसा मैंने रिफ्लेक्टर के लिए एक परीक्षण स्थापित किए बिना किया है।
बर्नहार्ड्रश

49

आप ILDASM का उपयोग कर सकते हैं ...

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

और आउटपुट में 'मेटाडेटा सेक्शन' की जाँच करें। यह कुछ इस तरह होगा:

मेटाडेटा अनुभाग: 0x424a5342, संस्करण: 1.1, अतिरिक्त: 0, संस्करण लेन: 12, संस्करण: v4.0.30319

'संस्करण' टैग आपको .NET फ्रेमवर्क संस्करण बताएगा। उपरोक्त उदाहरण में यह 4.0.30319 है


3
मैं यहाँ क्या देख रहा हूँ? इसका मतलब .NET 4.0 है? // Metadata section: 0x424a5342, version: 1.1, extra: 0, version len: 12, versio n: v4.0.30319
पीटरएक्स

हाँ, .NET 2 के लिए मुझे निम्नलिखित मिलते हैं: // मेटाडेटा अनुभाग: 0x424a5342, संस्करण: 1.1, अतिरिक्त: 0, संस्करण लेन: 12, संस्करण: v2.0.50727
शमौन

17

आपके पास कुछ विकल्प हैं: इसे प्रोग्रामेटिक रूप से प्राप्त करने के लिए, प्रबंधित कोड से, असेंबली का उपयोग करें। MageRuntimeVersion:

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

कमांड लाइन से, v2.0 में शुरू, ildasm.exe इसे दिखाएगा यदि आप "MANIFEST" पर डबल-क्लिक करते हैं और "मेटाडेटा संस्करण" की तलाश करते हैं। एक छवि का सीएलआर संस्करण निर्धारित करना


कैसे करें CurrentRDomain के लिए ImageRuntimeVersion?
किकेनेट


15

बस बस

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

1
मुझे नहीं पता कि यह क्यों डाउनवोट किया गया है, लेकिन मैं स्निपेट (System.Runtime.Versioning की आवश्यकता के संदर्भ में) चला सकता हूं और सफलतापूर्वक आउटपुट प्राप्त कर सकता हूं (यह LINQPad से है): TypeId टाइपऑफ (टार्गेटवर्कवर्कअवतार) FrameworkName .NETFramework। संस्करण = v4.0 फ्रेमवर्कडिप्लेनेम .नेट फ्रेमवर्क 4
सुधांशु मिश्रा

यह कोड ढांचे के पूर्ण संस्करण को पुनः प्राप्त नहीं करता है। "4.0" जानना अच्छा है, लेकिन "v4.0.30319" यदि आप कहें, तो RegAsm.exe प्राप्त करने का प्रयास करते हुए अधिक उपयोगी होगा। अधिक पूर्ण संस्करण जानकारी में पाया जा सकता है: string tar = Assembly.LoadFrom (@ "myAssembly.dll")। ImageRuntimeVersion;
मार्टिन

यह सही दृष्टिकोण की तरह लगता है, क्या कोई ऐसी स्थिति है जहां एक विधानसभा में यह विशेषता लागू नहीं हो सकती है? मैंने इसे .NET कोर असेंबली के साथ परीक्षण किया है और यह नेटकोर और संस्करण संख्या को सही ढंग से रिपोर्ट करता है।
एडम नायलर

यह मेरे लिए काम नहीं करता है। के GetCustomAttributesपास नहीं है TargetFrameworkAttribute। लेकिन ImageRuntimeVersion ठीक काम करता है, हालांकि, यह सही सीएलआर को पुनः प्राप्त करता है जो बाइनरी के लिए बनाया गया था। मुझे लक्ष्य रूपरेखा संस्करण की आवश्यकता है जिसके लिए इसे बनाया गया था।
शामील मोहम्मद

13

विजुअल स्टूडियो के माध्यम से एक और विकल्प, किसी भी परियोजना के लिए DLL का संदर्भ जोड़ें, फिर नए संदर्भ पर राइट-क्लिक करें और गुण क्लिक करें, आप देख सकते हैं कि आप रनटाइम संस्करण में क्या देख रहे हैं:

यहां छवि विवरण दर्ज करें


मुझे लगता है कि यह सवाल उस समय के बारे में नहीं पूछ रहा है जब एक डीएलएल को विजुअल स्टूडियो में संदर्भित किया जाता है, लेकिन किसी भी '.NET .NET DLL को आप अपने पीसी पर लेट पाते हैं।
ashes999

7
यह उत्तर बताता है कि आप अपने पीसी पर किसी भी ol '.NET DLL के आसपास एक संदर्भ जोड़ सकते हैं, और संदर्भ के तहत आइटम के गुणों में से एक DLL "रनटाइम संस्करण" है।
अलेक्सिंटलोस

8

इसे ILDASM के साथ घटाएं, और mscorlib के संस्करण को देखें जिसे संदर्भित किया जा रहा है (शीर्ष पर बहुत सही होना चाहिए)।


4

सबसे सरल तरीका: बस किसी भी टेक्स्ट एडिटर में .dll खोलें। अंतिम लाइनों में से एक को देखो: यहां छवि विवरण दर्ज करें


सभी के बीच सबसे अच्छा विकल्प
शिशिर

2
हालाँकि, इससे पहले निर्मित dlls के लिए काम नहीं करता है .net 3.0
Sisir

2

मैंने ऐसा करने के लिए जल्दी से इस C # कंसोल ऐप को लिखा:

https://github.com/stuartjsmith/binarydetailer

बस एक डायरेक्टरी को एक पैरामीटर के रूप में पास करें और यह आपकी पूरी कोशिश करेगा कि आप प्रत्येक dll के लिए नेट फ्रेमवर्क बताएं और वहां एक्सई करें


अच्छी विस्तृत जानकारी देता है; यह एक कमांड-लाइन ऐप है; आपको इसे कमांड-लाइन पर निर्देशिका का नाम देना होगा।
फिलु

2

" डिटेक्ट इट इजी " को DiE के रूप में भी जाना जाता है, यह फाइलों के प्रकारों के निर्धारण का एक कार्यक्रम है। .Dll फ़ाइलों या अन्य (.exe) फ़ाइलों के साथ काम करता है। वाणिज्यिक और गैर-व्यावसायिक उपयोग के लिए बिल्कुल मुफ्त।

यहां छवि विवरण दर्ज करें


0

यदि आपके पास DotPeekहै JetBrains, तो आप इसे देख सकते हैं Assembly Explorer

क्या आप इस स्क्रीनशॉट को देख सकते हैं?  मैं नहीं:(


0

यहां जवाबों पर विस्तार करते हुए, यह निर्भर विधानसभा होने पर उड़ा सकता है। यदि आप भाग्यशाली हैं और आपको पता है कि आश्रित कहाँ है (या भाग्य भी, यह जीएसी में है) तो यह मदद कर सकता है ...

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

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