2008-09-18 11 views

उत्तर

34

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

+2

उपयोगकर्ता लिसा से पोस्ट के नीचे वास्तव में काम करता है इसलिए यह उत्तर उत्तर के रूप में चिह्नित किया गया है लेकिन उचित कारण के बिना। – Roboblob

+6

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

9

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

4

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

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

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

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

1

Get Types आपको असेंबली में परिभाषित Type ऑब्जेक्ट्स की एक सूची देता है। उस ऑब्जेक्ट में नामस्थान संपत्ति है। याद रखें कि एक असेंबली में कई नामस्थान हो सकते हैं।

0

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

+3

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

47

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

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

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

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

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); 

यह भी देखें: How to get Namespace of an Assembly?

संपादित करें: करने के लिए बहुत बढ़िया विचार: इसके अलावा सवाल मैं http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/3a469f5d-8f55-4b25-ac25-4778f260bb7e

पर जवाब दे रहा हूँ एक ही सवाल के साथ मामला लोगों में एक और संपादित की तलाश में आने के लिए एक बहुत विस्तृत जवाब देखा संसाधन लोडिंग प्रश्न यहाँ का समाधान: How get the default namespace of project csproj (VS 2008)

+1

यह कोड वास्तव में काम करता है। धन्यवाद! – Roboblob

+2

एम्बेडेड संसाधन संकल्प के साथ समस्याएं थी जब असेंबली नाम मेरे प्रोजेक्ट का "रूट नेमस्पेस" मेल नहीं खाता था। उपयोगी पोस्ट –

+0

के लिए धन्यवाद क्या आप नामस्थान के बिना कक्षा बना सकते हैं और टाइपफ़ोफ़ (डिफ़ॉल्ट नामस्थान हेल्पर) का उपयोग नहीं कर सकते हैं। नेमस्पेस? – drake7707

2
GetType(frm).Namespace 

frm सेंट है आर्टअप फॉर्म

+0

क्या होगा अगर स्टार्टअप फॉर्म रूट नेमस्पेस में नहीं है? –

0

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

बजाय कोड यहां दोहराने, कृपया get Default namespace name for Assembly.GetManifestResourceStream() method

3

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

typeof(Root).Namespace; 

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

+0

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

0

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

0

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

एक छोटी सी hacky लेकिन आप केवल एक स्टैकट्रेस और फिल्टर हड़पने कर सकते हैं: सिस्टम के लिए

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

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

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

  • आप दृश्य स्टूडियो का उपयोग कर रहे हैं और एक रूट नामस्थान अपनी परियोजना है, जो मुझे लगता है के लिए परिभाषित किया है आप जब से तुम शब्द का उपयोग जो चाह रहे हैं "है जड़ नाम स्थान "
  • आप संदर्भित विधानसभाओं
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

यहाँ एक वेबसाइट proje के लिए जड़ नाम स्थान प्राप्त करने के लिए एक नहीं बल्कि सरल तरीके के रूप में से इंटरॉप प्रकार को एम्बेड नहीं कर रहे हैं सीटी।

''' <summary> 
''' Returns the namespace of the currently running website 
''' </summary> 
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" प्रकार के लिए सभी लोड विधानसभाओं जाँच करता है और उस प्रकार के लिए जड़ नाम स्थान देता है। यह लॉगिंग के लिए उपयोगी है जब आपके पास लॉग सिस्टम साझा करने वाले एकल समाधान में एकाधिक वेब प्रोजेक्ट हैं। उम्मीद है कि यह किसी की मदद करता है।

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