मैं प्रोग्राम को .net2.0 में किसी एप्लिकेशन का GUID कैसे प्राप्त कर सकता हूं


100

मुझे C # .NET2.0 में अपनी परियोजना की असेंबली का उपयोग करने की आवश्यकता है।

मैं प्रोजेक्ट संपत्तियों के तहत 'असेंबली इन्फॉर्मेशन' डायलॉग में GUID देख सकता हूं, और फिलहाल मैंने इसे कोड में एक कॉस्ट में कॉपी किया है। GUID कभी नहीं बदलेगी, इसलिए यह समाधान का उतना बुरा नहीं है, लेकिन इसे सीधे एक्सेस करना अच्छा होगा। क्या इसे करने का कोई तरीका है?

जवाबों:


152

निम्नलिखित कोड का प्रयास करें। आप जिस मूल्य की तलाश कर रहे हैं, वह असेंबली से जुड़ी एक गाइडअटेब्रिटी उदाहरण पर संग्रहीत है

using System.Runtime.InteropServices;

static void Main(string[] args)
{
    var assembly = typeof(Program).Assembly;
    var attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute),true)[0];
    var id = attribute.Value;
    Console.WriteLine(id);
}

4
'टाइपऑफ़ (प्रोग्राम)। एवेस्म' के बजाय 'AppDomain.CurrentDomain.DomainManager.EntryAssembly' का उपयोग कैसे करें? ठीक है, हम प्रोग्राम क्लास का नाम बदल सकते हैं, क्या हम नहीं कर सकते?
केनिअल

11
Googling के कुछ सेकंड के लिए किसी अन्य व्यक्ति को बचाने के लिए, GuideAttribute नामस्थान सिस्टम में है। रनटाइम। InteropServices।
ब्रायस वैगनर

5
@BryceWagner ctrl+.आपका दोस्त है
अधिकतम

@ मैं System.AppDomain.DomainManager.get returned null.एक सरल कंसोल ऐप के लिए मिलता हूं । लगता Assembly.GetEntryAssembly()है कि पसंदीदा तरीका है।
जेसी सी। स्लाइसर

11

दूसरा तरीका है मार्शल का उपयोग करना । GetTypeLibGuidForAssembly

Msdn के अनुसार:

जब असेंबली को टाइप लाइब्रेरीज़ में एक्सपोर्ट किया जाता है, तो टाइप लाइब्रेरी को LIBID असाइन किया जाता है। आप विधानसभा स्तर पर System.Runtime.InteropServices.GuidAttribute को लागू करके स्पष्ट रूप से LIBID सेट कर सकते हैं, या इसे स्वचालित रूप से जनरेट किया जा सकता है। Tlbimp.exe (टाइप लाइब्रेरी आयातक) उपकरण असेंबली की पहचान के आधार पर एक LIBID मान की गणना करता है। GetTypeLibGuid उस LIBID को लौटाता है, जो यदि विशेषता लागू होने पर, GuideAttribute से संबद्ध है। अन्यथा, GetTypeLibGuidForAssembly परिकलित मान लौटाता है। वैकल्पिक रूप से, आप किसी मौजूदा प्रकार की लाइब्रेरी से वास्तविक LIBID निकालने के लिए GetTypeLibGuid विधि का उपयोग कर सकते हैं।


मैं एफ # में ऐसा करने में सक्षम था, ऐसा लगता है कि विधानसभा के पास
गाइड के

यह विधि Assembly.ReflectionOnlyLoadतब भी काम करती है जब आश्रित असेंबलियों को लोड नहीं किया जाता है।
मार्टिन लॉटरिंग

तो, पूरा कोड है: System.Runtime.InteropServices.Marshal.GetTypeLibGuidForAssembly(System.Reflection.Assembly.GetExecutingAssembly()).ToString()। दूसरी विधि की तुलना में बहुत सरल लगता है। क्या कोई डाउनसाइड है?
यूजर

7

या, बस के रूप में आसान:

string assyGuid = Assembly.GetExecutingAssembly().GetCustomAttribute<GuidAttribute>().Value.ToUpper();

मेरे लिये कार्य करता है...


6

आपको प्रतिबिंब के माध्यम से विधानसभा की गाइड विशेषता को पढ़ने में सक्षम होना चाहिए। यह वर्तमान विधानसभा के लिए GUID प्राप्त करेगा

         Assembly asm = Assembly.GetExecutingAssembly();
        var attribs = (asm.GetCustomAttributes(typeof(GuidAttribute), true));
        Console.WriteLine((attribs[0] as GuidAttribute).Value);

यदि आप असेम्बलीटाइटल, असेंबली वर्जन इत्यादि जैसी चीजों को पढ़ना चाहते हैं, तो आप गाइड एट्रिब्यूट को अन्य विशेषताओं के साथ बदल सकते हैं।

आप वर्तमान असेंबली प्राप्त करने के बजाय किसी अन्य असेंबली (असेंबली। लोड और सभी) को लोड कर सकते हैं - यदि आपको बाहरी असेंबली की इन विशेषताओं को पढ़ने की आवश्यकता है (जैसे - एक प्लगइन लोड करते समय)


6
कृपया "के रूप में" कास्ट का उपयोग न करें यदि आप कलाकारों के परिणाम का उपयोग करने जा रहे हैं, तो कोई बात नहीं। यह आम तौर पर खराब शैली है क्योंकि आप अधिक जानकारीपूर्ण InvalidCastException के बजाय NullReferenceException प्राप्त करते हैं यदि कलाकार विफल रहता है। "के रूप में" कास्ट के लिए हैं जब आप नहीं जानते कि क्या वस्तु दी गई प्रकार की है और केवल उसी स्थिति में इसका उपयोग करना चाहते हैं। बस एक प्रत्यक्ष ((गाइडएट्रिब्यूट) एट्रीब्यूट्स [0]) का उपयोग करें। इसके बजाय यदि आप इसकी अपेक्षा नहीं करते हैं कि यह दूसरे प्रकार का है (जो ऐसा नहीं होना चाहिए)
poizan42

5

मामले में किसी और को बॉक्स के बाहर काम करने के उदाहरण की तलाश है, यह वही है जो मैंने पिछले उत्तरों के आधार पर उपयोग किया था।

using System.Reflection;
using System.Runtime.InteropServices;

label1.Text = "GUID: " + ((GuidAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(GuidAttribute), false)).Value.ToUpper();

अपडेट करें:

चूंकि इस पर थोड़ा ध्यान दिया गया है इसलिए मैंने इसे करने का एक और तरीका शामिल करने का फैसला किया है जिसका मैं उपयोग कर रहा हूं। इस तरह से आप इसे स्थिर वर्ग से उपयोग कर सकते हैं:

    /// <summary>
    /// public GUID property for use in static class </summary>
    /// <returns> 
    /// Returns the application GUID or "" if unable to get it. </returns>
    static public string AssemblyGuid
    {
        get
        {
            object[] attributes = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(GuidAttribute), false);
            if (attributes.Length == 0) { return String.Empty; }
            return ((System.Runtime.InteropServices.GuidAttribute)attributes[0]).Value.ToUpper();
        }
    }

1

एप्लिकेशन को प्राप्त करने के लिए आप निम्न लाइन कोड का उपयोग कर सकते हैं:

var applicationId = ((GuidAttribute)typeof(Program).Assembly.GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value;

इसके लिए आपको शामिल करना होगा System.Runtime.InteropServices;


1

अन्य उत्तरों के साथ यहाँ कोई भाग्य नहीं है लेकिन इस अच्छे एक लाइनर के साथ इसे काम करने में कामयाब रहे:

((GuidAttribute)(AppDomain.CurrentDomain.DomainManager.EntryAssembly).GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value

उम्मीद है की यह मदद करेगा!

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