2010-03-13 13 views
5

एक VSTO Excel में कोड addin: \ Users \ डौग \ दस्तावेज़ \ XMLFile1:उद्घाटन एक्सएमएल फ़ाइल ऐड फ़ोल्डर में स्थित

Dim XMLDoc As XElement = XElement.Load("XMLFile1.xml") 

संदेश ("फ़ाइल नहीं मिल सकी 'सी के साथ एक FileNotFound त्रुटि उत्पन्न .xml ' ") यह मेरे दस्तावेज़ फ़ोल्डर में देख रहा है लेकिन एक्सएमएल फ़ाइल उस प्रोजेक्ट के लिए वीएस प्रोजेक्ट्स फ़ोल्डर में स्थित है। मैंने XML फ़ाइल की "प्रतिलिपि निर्देशिका में कॉपी करें" संपत्ति को "हमेशा कॉपी करें" पर सेट किया है। जब मैं कोड को बदलता हूं तो XML फ़ाइल के पूर्ण पथ को शामिल करने के लिए कोड बदलता है।

इसके अलावा, यदि मैं उपरोक्त कोड को Windows कंसोल या अन्य प्रकार के प्रोजेक्ट में शामिल करता हूं तो यह सही ढंग से चलता है। मैं इसे केवल एक्सेल एडिन में प्राप्त कर रहा हूं। उपर्युक्त वीएसटीओ 2008/एक्सेल 2003 और वीएसटीओ 2010/एक्सेल 2010 के लिए सच है।

उत्तर

13

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

यदि आपकी फ़ाइल को आपके VSTO ऐड-इन असेंबली के समान फ़ोल्डर में तैनात किया जाएगा, तो आप फ़ाइल के पूर्ण पथ को बनाने के लिए (AppDomain.CurrentDomain.BaseDirectory) का उपयोग कर सकते हैं।

उदाहरण के लिए, सी # में:

string filename = "XMLFile1.xml"; 

string path = Path.Combine(
    AppDomain.CurrentDomain.BaseDirectory, 
    filename); 

XElement.Load(path); 
+0

जोआओ, बहुत बहुत धन्यवाद। यह काम करता है। –

+1

@ जोओ, यह शानदार है। यह सुनिश्चित नहीं है कि आपको यह मणि कैसे मिला, क्योंकि मैं पूरे दिन बिंग कर रहा हूं और इस VSTO समस्या का उत्तर नहीं मिला। आपका जवाब स्पॉट पर था! बहुत बहुत धन्यवाद! –

+0

सभी VSTO समाधान मैंने कामकाजी निर्देशिका प्राप्त करने के लिए 'पर्यावरण। वर्तमान डायरेक्टरी' का उपयोग किया, जो हमेशा कल तक काम करता था, मैंने इसे पहले वीएस बग के रूप में लिया क्योंकि यह सापेक्ष पर्यावरण चर है। मैंने वीएस कामकाजी डीआईआर को कई तरह से बदलने की कोशिश की ... कोई सफलता नहीं। बहुत धन्यवाद @ João –

1

तुम भी उपयोग कर सकते हैं:

Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase) 
संबंधित मुद्दे