आप असेंबली के रूट नेमस्पेस को कैसे प्राप्त करते हैं?

System.Reflection.Assembly के उदाहरण को देखते हुए।

0

13 उत्तर

संभव नहीं। कुछ भी "रूट" नामस्थान निर्दिष्ट नहीं करता है। विकल्पों में डिफ़ॉल्ट नामस्थान एक दृश्य स्टूडियो चीज है, न कि .NET चीज़

0
जोड़ा
@Roboblob Darren का जवाब तकनीकी रूप से सही है। मेरा 95% या ऐसे मामलों में केवल उपयोगी है जहां आप इसे वीएस में एक परियोजना के निर्माण के संदर्भ में जानना चाहते हैं।
जोड़ा लेखक Lisa, स्रोत
उपयोगकर्ता लिसा से पोस्ट के नीचे वास्तव में काम करता है इसलिए यह उत्तर उत्तर के रूप में चिह्नित किया गया है लेकिन उचित कारण के बिना।
जोड़ा लेखक Roboblob, स्रोत

किसी दिए गए असेंबली में नामस्थानों की संख्या हो सकती है, और कुछ भी उन्हें सामान्य रूट से शुरू करने की आवश्यकता नहीं है। सबसे अच्छा आप एक असेंबली में सभी प्रकारों को प्रतिबिंबित करना और उसमें निहित अद्वितीय नामस्थानों की एक सूची बनाना होगा।

0
जोड़ा

वास्तव में असेंबली के प्रकट संसाधनों के नामों की गणना करके इसे प्राप्त करने का एक अप्रत्यक्ष तरीका है। जिस नाम को आप चाहते हैं उसका हिस्सा उस हिस्से के साथ समाप्त होता है जिसे आप जानते हैं।

Rather than repeat the code here, please see get Default namespace name for Assembly.GetManifestResourceStream() method

0
जोड़ा

मेरे पास जो सवाल था वह मुझे यहां पहुंचा था, "अगर मैं लाइब्रेरी कोड एन विधियों को गहराई से कॉल करता हूं और परियोजना का नामस्थान चाहता हूं - उदाहरण के लिए एमवीसी ऐप जो वास्तव में चल रहा है - मैं इसे कैसे प्राप्त करूं?"

थोड़ा हैकी लेकिन आप सिर्फ एक स्टैकट्रैक पकड़ सकते हैं और फ़िल्टर कर सकते हैं:

    public static string GetRootNamespace()
    {
        StackTrace stackTrace = new StackTrace();
        StackFrame[] stackFrames = stackTrace.GetFrames();
        string ns = null;
        foreach(var frame in stackFrames)
        {
            string _ns = frame.GetMethod().DeclaringType.Namespace;
            int indexPeriod = _ns.IndexOf('.');
            string rootNs = _ns;
            if (indexPeriod > 0)
                rootNs = _ns.Substring(0, indexPeriod);

            if (rootNs == "System")
                break;
            ns = _ns;
        }

        return ns;
    }

यह सब कुछ कर रहा है, जो हाल ही में रूट से बुलाया गया है, और सिस्टम के लिए फ़िल्टरिंग से विधियों को चला रहा है। एक बार जब यह सिस्टम कॉल पाता है तो यह जानता है कि यह बहुत दूर चला गया है, और आपको तुरंत नामस्थान देता है। चाहे आप यूनिट टेस्ट, एक एमवीसी ऐप या एक सेवा चला रहे हों, सिस्टम कंटेनर आपके प्रोजेक्ट के रूट नेमस्पेस से 1 स्तर गहरा बैठा होगा, इसलिए वॉयला।

कुछ परिदृश्यों में जहां सिस्टम कोड ट्रेस के साथ एक मध्यस्थ (जैसे System.Task) है, यह गलत जवाब वापस करने जा रहा है। मेरा लक्ष्य उदाहरण के लिए कुछ स्टार्टअप कोड लेना था और इसे आसानी से क्लास या कंट्रोलर या रूट नेमस्पेस में जो कुछ भी मिलता है, भले ही काम करने वाला कोड लाइब्रेरी में बैठता हो। यह उस कार्य को पूरा करता है।

मुझे यकीन है कि इसमें सुधार किया जा सकता है - मुझे यकीन है कि चीजों को करने का यह हैकी तरीका कई तरीकों से सुधार किया जा सकता है, और सुधारों का स्वागत है।

0
जोड़ा

नेमस्पेस के पास असेंबली के साथ कुछ लेना देना नहीं है - किसी नामस्थान और कक्षाओं के बीच किसी भी मैपिंग को नामकरण सम्मेलन (या संयोग) के कारण पूरी तरह से किया जाता है।

0
जोड़ा
जबकि मैं सहमत हूं, यह ध्यान देने योग्य है कि विजुअल स्टूडियो प्रोजेक्ट में एक डिफ़ॉल्ट नेमस्पेस है और यदि आप संसाधन को एम्बेड करने के लिए विजुअल स्टूडियो का उपयोग करते हैं तो उस संसाधन का मेनिफेस्ट संसाधन नाम डिफ़ॉल्ट नामस्थान से लिया गया है और यदि आप असेंबली द्वारा परिभाषित किए जाएंगे असेंबली बनाने के लिए हमेशा विजुअल स्टूडियो का उपयोग कर रहे हैं। और चलो इसका सामना करते हैं यह बहुत आम है।
जोड़ा लेखक Lisa, स्रोत

असेंबली के पास जरूरी रूट नेमस्पेस नहीं है। नामस्थान और असेंबली ऑर्थोगोनल हैं।

इसके बजाय आप जो खोज रहे हैं, वह उस विधानसभा के भीतर एक प्रकार का पता लगाना है, और फिर पता लगाएं कि उसका नामस्थान क्या है।

आपको GetExportedTypes() सदस्य का उपयोग करके और फिर नामित संपत्ति हैंडल में से किसी एक से नेमस्पेस प्रॉपर्टी का उपयोग करके इसे पूरा करने में सक्षम होना चाहिए।

फिर भी, गारंटी नहीं है कि सभी प्रकार एक ही नामस्थान में हैं (या यहां तक ​​कि एक ही नामस्थान पदानुक्रम में)।

0
जोड़ा

Get Types gives you a list of Type objects defined in the assembly. That object has a namespace property. Remember that an assembly can have multiple namespaces.

0
जोड़ा

मैं इस दुविधा में कई बार आया हूं जब मैं वर्तमान विधानसभा से अपने प्रकट संसाधन स्ट्रीम द्वारा संसाधन लोड करना चाहता हूं।

तथ्य यह है कि यदि आप विजुअल स्टूडियो का उपयोग करके अपनी असेंबली में एक संसाधन के रूप में एक फ़ाइल के रूप में एम्बेड करते हैं तो इसका मैनिफेस्ट संसाधन नाम विजुअल स्टूडियो प्रोजेक्ट में परिभाषित असेंबली के डिफ़ॉल्ट नेमस्पेस से लिया जाएगा।

सबसे अच्छा समाधान जिसके साथ मैं आया हूं (डिफ़ॉल्ट नामस्थान को कहीं भी स्ट्रिंग के रूप में हार्डकोडिंग से बचने के लिए) यह सुनिश्चित करना है कि आपका संसाधन लोडिंग कोड हमेशा एक वर्ग के अंदर से हो रहा है जो डिफ़ॉल्ट नामस्थान में भी है और फिर निम्नलिखित निकट-सामान्य दृष्टिकोण उपयोग किया जा सकता है।

यह उदाहरण एम्बेडेड स्कीमा लोड कर रहा है।

XmlSchema mySchema;
string resourceName = "MyEmbeddedSchema.xsd";
string resourcesFolderName = "Serialisation";
string manifestResourceName = string.Format("{0}.{1}.{2}",
    this.GetType().Namespace, resourcesFolderName, resourceName);
using (Stream schemaStream = currentAssembly.GetManifestResourceStream(manifestResourceName))
    mySchema = XmlSchema.Read(schemaStream, errorHandler);

See also: How to get Namespace of an Assembly?

Edit: Also noticed a very detailed answer to the question I'm answering at http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/3a469f5d-8f55-4b25-ac25-4778f260bb7e

Another edit in case people with same question come looking: Excellent idea to solve the resource-loading question here: How get the default namespace of project csproj (VS 2008)

0
जोड़ा
एम्बेडेड संसाधन रिज़ॉल्यूशन में समस्याएं थीं जब असेंबली नाम मेरे प्रोजेक्ट का "रूट नेमस्पेस" मेल नहीं खाता था। मददगार पोस्ट के लिए शुक्रिया
जोड़ा लेखक Ivaylo Slavov, स्रोत
क्या आप नामस्थान के बिना कक्षा बना सकते हैं और टाइपफ़ोफ़ (डिफ़ॉल्ट नामस्थान हेल्पर) का उपयोग नहीं कर सकते हैं। नेमस्पेस?
जोड़ा लेखक drake7707, स्रोत
यह कोड वास्तव में काम करता है। धन्यवाद!
जोड़ा लेखक Roboblob, स्रोत
GetType(frm).Namespace

frm is the startup Form

0
जोड़ा
क्या होगा अगर स्टार्टअप फॉर्म रूट नेमस्पेस में नहीं है?
जोड़ा लेखक Patrick Hofman, स्रोत

मैंने अभी रूट नामक एक खाली आंतरिक कक्षा बनाई है और इसे प्रोजेक्ट रूट में रखा है (मान लीजिए कि यह आपका रूट नेमस्पेस है)। फिर मैं इसे हर जगह उपयोग करता हूं मुझे रूट नेमस्पेस की आवश्यकता होती है:

typeof(Root).Namespace;

निश्चित रूप से मैं एक अप्रयुक्त फ़ाइल के साथ समाप्त होता है, लेकिन यह साफ है।

0
जोड़ा
एक ही असेंबली में इसकी आवश्यकता होने पर उपयोगी, लेकिन इसे कठिन कोड नहीं करना चाहते हैं।
जोड़ा लेखक CSharper, स्रोत

मैं अपने wpf अनुप्रयोग में typeof (ऐप)। नेमस्पेस का उपयोग करता हूं। किसी भी wpf अनुप्रयोग के लिए ऐप क्लास अनिवार्य है और यह रूट में स्थित है।

0
जोड़ा

यहां सभी अन्य उत्तरों को जोड़कर, उम्मीद है कि जानकारी दोहराए बिना, यहां मैंने लिंक का उपयोग करके इसे हल किया है। मेरी स्थिति लिसा के जवाब के समान है।

मेरा समाधान निम्न चेतावनियों के साथ आता है:

  • आप विजुअल स्टूडियो का उपयोग कर रहे हैं और आपके प्रोजेक्ट के लिए रूट रूटस्पेस परिभाषित किया गया है, जो मुझे लगता है कि आप "रूट नेमस्पेस" शब्द का उपयोग करते समय आप क्या पूछ रहे हैं
  • आप संदर्भित असेंबली से इंटरऑप प्रकार एम्बेड नहीं कर रहे हैं
Dim baseNamespace = String.Join("."c,
    Me.GetType().Assembly.ManifestModule.GetTypes().
        Select(Function(type As Type)
                    Return type.Namespace.Split("."c)
                End Function
        ).
        Aggregate(Function(seed As String(), splitNamespace As String())
                        Return seed.Intersect(splitNamespace).ToArray()
                    End Function
        )
)
0
जोड़ा

वेबसाइट प्रोजेक्ट के लिए रूट नेमस्पेस प्राप्त करने के लिए यहां एक आसान तरीका है।

''' 
''' Returns the namespace of the currently running website '''
 
Public Function GetWebsiteRootNamespace() As String
    For Each Asm In AppDomain.CurrentDomain.GetAssemblies()
        If Asm Is Nothing OrElse Asm.IsDynamic Then Continue For

        For Each Typ In Asm.GetTypes
            If Typ Is Nothing OrElse Typ.Name Is Nothing Then Continue For
            If Typ.Name = "MyProject" Then Return Typ.Namespace.Split("."c)(0)
        Next
    Next

    Return Nothing
End Function

यह बस "MyProject" प्रकार के लिए सभी लोडेड असेंबली की जांच करता है और उस प्रकार के रूट रूटस्पेस देता है। यह लॉगिंग के लिए उपयोगी है जब आपके पास लॉग सिस्टम साझा करने वाले एकल समाधान में एकाधिक वेब प्रोजेक्ट हैं। उम्मीद है कि यह किसी की मदद करता है।

0
जोड़ा