2010-02-22 24 views
46

कमांड लाइन (या वास्तव में किसी भी तरह से) से फ्रेमवर्क (सीएलआर) संस्करण निर्धारित करें, मैं कैसे निर्धारित कर सकता हूं कि CLR संस्करण .NET असेंबली की आवश्यकता है?असेंबली

मुझे यह निर्धारित करने की आवश्यकता है कि किसी असेंबली को 2.0 या 4.0 सीएलआर संस्करण की आवश्यकता है या नहीं।

उत्तर

49

ildasm.exe यदि आप "MANIFEST" पर डबल-क्लिक करें और "मेटाडेटा संस्करण" देखें तो उसे दिखाएगा। डिफ़ॉल्ट रूप से, यह संस्करण है कि छवि के खिलाफ संकलित किया गया था।

+0

बहुत बहुत धन्यवाद :-) –

+0

इसे खोलने के लिए शायद "विन-स्टार्ट" दबाएं, 'प्रॉम्प्ट' टाइप करें और अपना विजुअल- स्टूडियो "वीएस XXXX के लिए डेवलपर कमांड प्रॉम्प्ट"। फिर आप कमांड लाइन के माध्यम से 'ildasm' का उपयोग कर सकते हैं या UI खोलने के लिए 'ildasm.exe' टाइप कर सकते हैं और इस उत्तर में वर्णित की तरह इसका उपयोग कर सकते हैं। मुझे मिला [mscorlib] System.Runtime.Versioning.TargetFrameworkAttribute ::। Ctor (string) 'जिसमें फ्रेमवर्क-संस्करण शामिल है। (शायद खिड़की को अधिकतम करें। हेक्स-वैल्यू का दाहिना तरफ एएससीआईआईआई-इंटरप्रेटियन है) – MichiBack

31
class Program { 
    static void Main(string[] args) { 
     System.Console.WriteLine(
      System.Reflection.Assembly.LoadFrom(args[0]).ImageRuntimeVersion); 
    } 
} 

संकलित करें और नवीनतम .नेट फ्रेमवर्क के तहत ऊपर एप्लिकेशन को चलाने के (एक पुराने CLR के रूप में असमर्थ हो सकता है एक नए CLR की आवश्यकता होती है विधानसभाओं लोड करने के लिए) है और यह विधानसभा आप के रूप में जाँच करना चाहते हैं के लिए पथ गुजर चलाने कमांड लाइन तर्क।

+0

+1 धन्यवाद। यह स्वचालन के लिए उपयोगी है। –

+0

यह उत्तर समस्या के बिना पुराने मिश्रित मोड असेंबली लोड करते समय समस्याग्रस्त है LegacyV2RuntimeActivationPolicy कॉन्फ़िगरेशन ध्वज। – gigaplex

+0

धन्यवाद। एक पुराना .NET डीएल, सीसीडब्ल्यू था, मैं 64-बिट .NET 4 संस्करण के साथ फिर से लिख रहा/प्रतिस्थापित कर रहा हूं और मेरे जीवन के लिए यह सुनिश्चित करने के लिए याद नहीं किया जा सकता कि मूल अभी भी .NET v1.1 था या उसे छुआ गया था पूर्व माइग्रेशन प्रोजेक्ट और v2.x में अपग्रेड किया गया। इसने चाल को अच्छी तरह से किया और पुष्टि की कि हमारे प्रोड संस्करण अभी भी v1.1.4322 है। – Developer63

5

कमांड लाइन से

अपने dll/exe/CLRHEADER

+0

दिलचस्प, धन्यवाद। –

+2

मुझे "2.05 रनटाइम संस्करण" सहित क्रिप्टिक झंडे का एक गुच्छा मिलता है, लेकिन यह एक .NET 4.0 असेंबली है। –

8

यहाँ DUMPBIN एक और जवाब में सुझाव दिया .NET कोड का एक PowerShell बराबर है। पावरशेल का उपयोग करना मतलब है कि आप एक असेंबली बनाने और संकलित करने जैसे कुछ चरणों को छोड़ सकते हैं।

एक PowerShell प्रॉम्प्ट पर, निम्न चलाएँ:

[System.Reflection.Assembly]::LoadFrom("C:\...\MyAssembly.dll").ImageRuntimeVersion 

डिफ़ॉल्ट रूप से, PowerShell, .NET वी 2 क्रम का उपयोग करता है ताकि आप v4 लक्ष्यीकरण विधानसभाओं के लिए एक अपवाद मिल जाएगा। स्टैक ओवरफ़्लो प्रश्न How can I run PowerShell with the .NET 4 runtime? यदि आवश्यक हो, तो इसे बदलने के लिए विवरण विधियां।

4

मैं ReflectionOnlyLoadFrom (उपयोग करने का सुझाव चाहते हैं) LoadFrom()

यह एक लाभ यह है कि जब 86 मशीन पर चल x64 और ia64 विधानसभाओं लोड कर सकते हैं, जबकि LoadFrom() ऐसा करने में असफल हो जायेगी के insted।

हालांकि यह अभी भी 2.0 शक्तियों से .NET 4.0 असेंबली लोड नहीं करेगा।

28

एक स्पष्टीकरण ...

सभी का उल्लेख तरीकों के साथ समस्या यह है कि वे वापस आ जाएगी संस्करण 4.0 यदि विधानसभा .NET फ़्रेमवर्क 4.0, 4.5 या 4.5.1 के खिलाफ संकलित किया गया है।

रास्ता रनटाइम पर प्रोग्राम के रूप में इस संस्करण यह पता लगाने के लिए दिया विधानसभा के लिए System.Runtime.Versioning.TargetFrameworkAttribute उपयोग कर रहा है, उदाहरण के

के लिए
using System; 
using System.Linq; 
using System.Reflection; 
using System.Runtime.Versioning; 

...  

object[] list = Assembly.GetExecutingAssembly().GetCustomAttributes(true); 
var attribute = list.OfType<TargetFrameworkAttribute>().First(); 

Console.WriteLine(attribute.FrameworkName); 
Console.WriteLine(attribute.FrameworkDisplayName); 

वापसी करेंगे

a.FrameworkName ".NETFramework,Version=v4.0" string 
a.FrameworkDisplayName ".NET Framework 4"  string 

a.FrameworkName ".NETFramework,Version=v4.5" string 
a.FrameworkDisplayName ".NET Framework 4.5" string 

a.FrameworkName ".NETFramework,Version=v4.5.1" string 
a.FrameworkDisplayName ".NET Framework 4.5.1" string 
+1

कमांड लाइन 'सीएससी' के साथ संकलित एक प्रोग्राम के साथ कोशिश की, काम नहीं किया (कोई 'targetFrameworkAttribute') नहीं। बीटीडब्ल्यू। आपका कोड सरलीकृत किया जा सकता है: 'सिस्टम। रनटाइम। वर्जनिंग। लक्ष्यफ्रेमवर्क एक = list.OfType ()। पहले(); ' – 0xF

+0

यह केवल .NET 4.0 और ऊपर की ओर उपलब्ध है, और हाँ कोड सरलीकृत किया जा सकता है। –

+0

.NET 4.5 'csc' के साथ प्रयास किया, कोई 'targetFrameworkAttribute' नहीं। – 0xF

1

@mistika के रूप में सुझाव दिया गया है, LoadFrom() के बजाय ReflectionOnlyLoadFrom() का उपयोग करना बेहतर है। इसका नकारात्मक पक्ष यह है कि GetCustomAttributes() को ReflectionOnlyLoadFrom() से लोड की गई असेंबली पर अपवाद फेंकता है। इसके बजाय आप GetCustomAttributesData() कॉल करने की आवश्यकता:

var assembly = Assembly.ReflectionOnlyLoadFrom(assemblyPath); 
var customAttributes = assembly.GetCustomAttributesData(); 
var targetFramework = customAttributes.FirstOrDefault(attr => attr.AttributeType.Equals(typeof(TargetFrameworkAttribute))); 

var frameworkName = string.Empty; 
var frameworkDisplayName = string.Empty; 
if (null != targetFramework) 
{ 
    if(targetFramework.ConstructorArguments.Any()) 
    { 
     // first argument is the name of the framework. 
     frameworkName = (string)targetFramework.ConstructorArguments[0].Value; 
    } 

    // search for a named argument called "FrameworkDisplayName" 
    var frameworkDisplayNameArg = targetFramework.NamedArguments.FirstOrDefault(arg => arg.MemberName.Equals("FrameworkDisplayName")); 
    if (null != frameworkDisplayNameArg) 
    { 
     frameworkDisplayName = (string)frameworkDisplayNameArg.TypedValue.Value; 
    } 
} 

Console.WriteLine("Framework Name: " + frameworkName); 
Console.WriteLine("Framework Display Name: " + frameworkDisplayName); 
0

आप एक स्क्रिप्ट में परिणाम शामिल करना चाहते हैं, मैं उत्पादन से ildasm.exe के पाठ उत्पादन का उपयोग करना चाहिये, और फिर grep "संस्करण स्ट्रिंग"।

"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe" /text D:\LocalAssemblies\Toolfactory.Core.BaseTypes.dll /noil /headers | find "' Version String" 

नोट मैं एक 'तो find आदेश "संस्करण स्ट्रिंग की लंबाई" नहीं पहचानता है

-2

प्रयास करें इस Assembly Information विधानसभा संस्करण है, जो आपको बताता है CLR संस्करण ऐसा करना आवश्यक हो पाने के लिए निष्पादन योग्य है, और साथ ही अन्य शामिल जानकारी इस तरह के संकलन विकल्प, लक्ष्य प्रोसेसर और संदर्भ के रूप में:

enter image description here

+0

यह असेंबली_ का _version देता है, न कि इसे चलाने के लिए आवश्यक .Net संस्करण। – rymdsmurf

+0

@rymdsmurf, मेरा उत्तर ओपी की ज़रूरत को पूरा करता है। हालांकि यह .Net संस्करण नहीं देता है लेकिन यह असेंबली संस्करण देता है, जो बताता है कि .NET संस्करण के लिए यह आवश्यक नहीं है! ऊपर दिए गए अधिकांश उत्तर विधानसभा संस्करण प्राप्त करने का प्रदर्शन करते हैं, तो क्या आप उन्हें सभी को वोट देना चाहिए !? – yantaq

+0

चित्र में हाइलाइट किए गए टेक्स्ट के साथ आपका शब्द, सुझाव देता है कि आपका उत्तर मूल असेंबली के असेंबली संस्करण को पुनर्प्राप्त करने का तरीका बताता है (ओपी के प्रश्न में उल्लिखित एक)। लेकिन उस असेंबली के संस्करण के ढांचे की निर्भरताओं के संस्करण के साथ कुछ लेना देना नहीं है। यदि यह आपके लिए नहीं है, तो शायद आपको किसी अन्य तरीके से उत्तर तैयार करना चाहिए, और शायद स्क्रीनशॉट को प्रतिस्थापित करना चाहिए। – rymdsmurf

1

टेलीरिक से जस्ट डीकंपाइल एक बहुत अच्छा टूल है। आप असेंबली खोल सकते हैं और टूल दिखा रहा है कि वे 4.5, 4.5.1 या 4.6

संबंधित मुद्दे