System.Reflection.Assembly
के उदाहरण को देखते हुए।आप असेंबली के रूट नेमस्पेस को कैसे प्राप्त करते हैं?
उत्तर
संभव नहीं है। कुछ भी "रूट" नामस्थान निर्दिष्ट नहीं करता है। विकल्पों में डिफ़ॉल्ट नामस्थान एक दृश्य स्टूडियो चीज है, न कि एक .net चीज
किसी दिए गए असेंबली में नामस्थानों की संख्या हो सकती है, और कुछ भी उन्हें सामान्य रूट से शुरू करने की आवश्यकता नहीं है। सबसे अच्छा आप एक असेंबली में सभी प्रकारों को प्रतिबिंबित करना और उसमें निहित अद्वितीय नामस्थानों की एक सूची बनाना होगा।
असेंबली के पास रूट नेमस्पेस आवश्यक नहीं है। नामस्थान और असेंबली ऑर्थोगोनल हैं।
इसके बजाय आप जो खोज रहे हैं, वह उस विधानसभा के भीतर एक प्रकार ढूंढना है, और फिर पता लगाएं कि उसका नामस्थान क्या है।
आपको GetExportedTypes() सदस्य का उपयोग करके और फिर नामित संपत्ति हैंडल में से किसी एक से नामस्थान संपत्ति का उपयोग करके इसे पूरा करने में सक्षम होना चाहिए।
फिर भी, गारंटी नहीं है कि सभी प्रकार एक ही नामस्थान (या यहां तक कि उसी नामस्थान पदानुक्रम में) हैं।
नेमस्पेस के पास असेंबली के साथ कुछ लेना देना नहीं है - किसी नामस्थान के बीच कोई मैपिंग और असेंबली में कक्षाएं पूरी तरह नामकरण सम्मेलन (या संयोग) के कारण होती हैं।
जब भी मैं सहमत हूं, यह ध्यान देने योग्य है कि विजुअल स्टूडियो प्रोजेक्ट में एक डिफ़ॉल्ट नेमस्पेस है और यदि आप संसाधन को एम्बेड करने के लिए विजुअल स्टूडियो का उपयोग करते हैं तो उस संसाधन का मेनिफेस्ट संसाधन नाम डिफ़ॉल्ट नामस्थान से लिया गया है और असेंबली द्वारा स्वयं परिभाषित किया जाएगा आप असेंबली बनाने के लिए हमेशा विजुअल स्टूडियो का उपयोग कर रहे हैं। और चलो इसका सामना करते हैं यह बहुत आम है। – Lisa
मैं इस दुविधा में कई बार आया हूं जब मैं वर्तमान विधानसभा से अपने प्रकट संसाधन स्ट्रीम द्वारा संसाधन लोड करना चाहता हूं।
तथ्य यह है कि यदि आप विजुअल स्टूडियो का उपयोग करके अपनी असेंबली में संसाधन के रूप में फ़ाइल को एम्बेड करते हैं तो इसका मेनिफेस्ट संसाधन नाम विजुअल स्टूडियो प्रोजेक्ट में परिभाषित असेंबली के डिफ़ॉल्ट नेमस्पेस से लिया जाएगा।
सबसे अच्छा समाधान जिसके साथ मैं आया हूं (डिफ़ॉल्ट नामस्थान को कहीं भी स्ट्रिंग के रूप में हार्डकोडिंग से बचने के लिए) यह सुनिश्चित करना है कि आपका संसाधन लोडिंग कोड हमेशा एक वर्ग के अंदर से हो रहा है जो डिफ़ॉल्ट नामस्थान में भी है और फिर निम्न निकट-सामान्य दृष्टिकोण का उपयोग किया जा सकता है।
यह उदाहरण एक एम्बेडेड स्कीमा लोड कर रहा है।
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)
यह कोड वास्तव में काम करता है। धन्यवाद! – Roboblob
एम्बेडेड संसाधन संकल्प के साथ समस्याएं थी जब असेंबली नाम मेरे प्रोजेक्ट का "रूट नेमस्पेस" मेल नहीं खाता था। उपयोगी पोस्ट –
के लिए धन्यवाद क्या आप नामस्थान के बिना कक्षा बना सकते हैं और टाइपफ़ोफ़ (डिफ़ॉल्ट नामस्थान हेल्पर) का उपयोग नहीं कर सकते हैं। नेमस्पेस? – drake7707
GetType(frm).Namespace
frm
सेंट है आर्टअप फॉर्म
क्या होगा अगर स्टार्टअप फॉर्म रूट नेमस्पेस में नहीं है? –
वास्तव में असेंबली के प्रकट संसाधनों के नामों की गणना करके इसे प्राप्त करने का अप्रत्यक्ष तरीका है। जिस नाम को आप चाहते हैं उसका हिस्सा उस हिस्से के साथ समाप्त होता है जिसे आप जानते हैं।
बजाय कोड यहां दोहराने, कृपया get Default namespace name for Assembly.GetManifestResourceStream() method
मैं सिर्फ एक खाली आंतरिक वर्ग रूट नामक देख सकते हैं और परियोजना जड़ में रख (आपके जड़ नाम स्थान इस है यह सोचते हैं)। तब मैं इस हर जगह का उपयोग मैं जड़ नाम स्थान की जरूरत है:
typeof(Root).Namespace;
ज़रूर मैं एक अप्रयुक्त फ़ाइल के साथ खत्म हो, लेकिन यह साफ है।
एक ही असेंबली में इसकी आवश्यकता होने पर उपयोगी, लेकिन इसे कठिन कोड नहीं करना चाहते हैं। – CSharper
मैं अपने WPF एप्लिकेशन में typeof(App).Namespace
का उपयोग करता हूं। किसी भी WPF एप्लिकेशन के लिए ऐप क्लास अनिवार्य है और यह रूट में स्थित है।
प्रश्न जो मैंने यहां उतरा था, वह था, "अगर मैं लाइब्रेरी कोड एन विधियों को गहराई से कॉल करता हूं और परियोजना का नामस्थान चाहता हूं - उदाहरण के लिए एमवीसी ऐप जो वास्तव में चल रहा है - मैं इसे कैसे प्राप्त करूं?"
एक छोटी सी 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) ट्रेस के साथ है, यह गलत जवाब वापस करने जा रहा है। मेरा लक्ष्य उदाहरण के लिए कुछ स्टार्टअप कोड लेना था और इसे आसानी से क्लास या कंट्रोलर या रूट नेमस्पेस में जो कुछ भी मिलता है, भले ही काम करने वाला कोड लाइब्रेरी में बैठता हो। यह उस कार्य को पूरा करता है।
मुझे यकीन है कि इसमें सुधार किया जा सकता है - मुझे यकीन है कि चीजों को करने का यह हैकी तरीका कई तरीकों से बेहतर किया जा सकता है, और सुधारों का स्वागत है।
यहां अन्य सभी उत्तरों को जोड़ना, आशा है कि जानकारी दोहराए बिना, यहां मैंने लिंक का उपयोग करके इसे हल किया है। मेरी स्थिति लिसा के जवाब के समान है।
मेरे समाधान निम्न चेतावनियां साथ आता है:
- आप दृश्य स्टूडियो का उपयोग कर रहे हैं और एक रूट नामस्थान अपनी परियोजना है, जो मुझे लगता है के लिए परिभाषित किया है आप जब से तुम शब्द का उपयोग जो चाह रहे हैं "है जड़ नाम स्थान "
- आप संदर्भित विधानसभाओं
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
)
)
यहाँ एक वेबसाइट 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" प्रकार के लिए सभी लोड विधानसभाओं जाँच करता है और उस प्रकार के लिए जड़ नाम स्थान देता है। यह लॉगिंग के लिए उपयोगी है जब आपके पास लॉग सिस्टम साझा करने वाले एकल समाधान में एकाधिक वेब प्रोजेक्ट हैं। उम्मीद है कि यह किसी की मदद करता है।
- 1. रूट नेमस्पेस और असेंबली नाम
- 2. आप Django यूआरएल नेमस्पेस का उपयोग कैसे करते हैं?
- 3. रूट रूट के बिना आप एनपीएम (नोड पैकेज मैनेजर) कैसे सेट अप करते हैं?
- 4. .NET नेमस्पेस 'उपयोग' कीवर्ड के साथ आप कैसे हल करते हैं?
- 5. आप vb.net में स्ट्रिंगबिल्डर को कैसे प्राप्त करते हैं?
- 6. आप फ़ाइल आकार को सी # में कैसे प्राप्त करते हैं?
- 7. एक्सएमएल नेमस्पेस कैसे काम करते हैं
- 8. क्या आप वीबी.नेट में 'मेरा' नेमस्पेस का उपयोग करते हैं?
- 9. jQuery/फ़्लोट: आप डेटापॉइंट के निर्देशांक कैसे प्राप्त करते हैं?
- 10. आप अपने एक्सटेंशन विधियों के नामस्थान कैसे प्रबंधित करते हैं?
- 11. आप फाइलों में सी # कोड कैसे व्यवस्थित करते हैं?
- 12. आप जिस तारीख को डेटपर्ट से प्राप्त करते हैं, उस दिन के नाम से आप कैसे परिवर्तित करते हैं?
- 13. लिंक से एक्सएमएल पर पूछताछ करते समय आप मनमाने ढंग से नेमस्पेस कैसे प्रबंधित करते हैं?
- 14. विधानसभा के माध्यम से लोड की गई असेंबली को आप कैसे डिबग करते हैं। लोड (बाइट [])?
- 15. आप WMI नेमस्पेस के लिए कैसे पूछते हैं?
- 16. , आप आइटम को कैसे क्रमबद्ध करते हैं?
- 17. आप wx.Panel को रीफ्रेश कैसे करते हैं?
- 18. आप कैसे FB.Canvas.scrollTo को एनिमेट करते हैं?
- 19. आप XamlParseException को कैसे डिबग करते हैं?
- 20. आप JVM को कैसे क्रैश करते हैं?
- 21. आप प्रोटोटाइप कैसे करते हैं?
- 22. आप कैसे प्रतिक्रिया करते हैं?
- 23. आप सर्वर के रूट पासवर्ड
- 24. आप shell32.dll से आइकन कैसे प्राप्त करते हैं?
- 25. यूआईबटन ट्रिगर होने पर आप स्पर्श कैसे प्राप्त करते हैं।
- 26. Moment.js में, आप वर्तमान वित्तीय तिमाही कैसे प्राप्त करते हैं?
- 27. gen_servers में आप चुनिंदा प्राप्त कैसे करते हैं?
- 28. Eclipselink: आप प्रत्येक बंडल में EntityManager कैसे प्राप्त करते हैं?
- 29. आप DatePickerDialog से डेटपिकर कैसे प्राप्त करते हैं?
- 30. आप ASP.Net में फ़ील्ड स्तरीय सुरक्षा कैसे प्राप्त करते हैं?
उपयोगकर्ता लिसा से पोस्ट के नीचे वास्तव में काम करता है इसलिए यह उत्तर उत्तर के रूप में चिह्नित किया गया है लेकिन उचित कारण के बिना। – Roboblob
@Roboblob Darren का जवाब तकनीकी रूप से सही है।मेरा 95% या ऐसे मामलों में केवल उपयोगी है जहां आप इसे वीएस में एक परियोजना के निर्माण के संदर्भ में जानना चाहते हैं। – Lisa