2012-10-18 14 views
18

मेरे सी # आवेदन अपनी पूरी दोहरे उद्धरण चिह्नों से घिरा हुआ पथ एक फाइल करने के लिए, के साथ लिखता है मेरे आवेदन के निष्पादन योग्य पथ में # है, कुछ अजीब होता है। उत्पादन हो जाता है:अजीब सी # पथ मुद्दा

"D:\Dev\Projects#/MyApp/bin/Debug/MyApp.exe" 

स्लैश के बाद # स्लैश आगे हो गया है। यह उस प्रणाली के साथ मुद्दों का कारण बनता है जो मैं विकसित कर रहा हूं।

यह क्यों हो रहा है, और यह रोकने का कोई तरीका है जो स्ट्रिंग से अधिक सुरुचिपूर्ण है। लिखने से पहले पथ को बदलना?

+0

मैं इसे पुन: उत्पन्न नहीं कर सकता। मेरे पास मेरा ऐप सी: \ my # \ project \ foo.exe से चल रहा है और यह एप्लिकेशन को लिखता है। जैसा कि आपने ऊपर लिखा है, एक्स्प्रेसेबलपैथ सही ढंग से लिखा है। जब आप डीबग करते हैं तो एप्लिकेशन करता है। एक्सचेंज करने योग्य पाथ सही तरीके से निरीक्षण करता है? क्या आप लिखने वाले पाठ पर कोई पोस्ट-प्रोसेसिंग कर रहे हैं जो यहां नहीं दिखाया गया है? – Joe

+2

मैंने फ़ाइल को लिखने के लिए कोड के साथ, इसे एक नई परियोजना में फिर से परीक्षण किया। यह अभी भी पुनरुत्पादन करता है। इसका उपयोग करने वाला ढांचा 4.5 है यदि इससे कोई फर्क पड़ता है। – Ryan

+0

दिलचस्प, विशेष रूप से नीचे एलियन की पोस्ट के प्रकाश में। आश्चर्य है कि मैंने अलग-अलग क्या किया (हालांकि मैंने 4.0 फ्रेमवर्क का उपयोग किया ...) – Joe

उत्तर

9

मैं सिर्फ Application.ExecutablePath के स्रोत कोड में देखा, और कार्यान्वयन अनिवार्य रूप से इस * है:

Assembly asm = Assembly.GetEntryAssembly(); 
string cb = asm.CodeBase; 
var codeBase = new Uri(cb); 

if (codeBase.IsFile) 
    return codeBase.LocalPath + Uri.UnescapeDataString(codeBase.Fragment); 
else 
    return codeBase.ToString(); 

संपत्ति Assembly.CodeBase एक यूआरआई के रूप में स्थान वापस आ जाएगी। कुछ की तरह:

file:///C:/myfolder/myfile.exe

# यूआरआई में टुकड़ा मार्कर है; यह टुकड़े की शुरुआत को चिह्नित करता है। जाहिर है, Uri वर्ग दिए गए यूरी को बदलता है जब इसे पार्स किया जाता है और फिर एक स्ट्रिंग में परिवर्तित कर दिया जाता है।

के बाद से Assembly.Location एक 'सामान्य' फ़ाइल पथ है, मुझे लगता है अपने सबसे अच्छे विकल्प नहीं है:

string executablePath = Assembly().GetEntryAssembly().Location; 

* ) कार्यान्वयन इस से अधिक जटिल है, क्योंकि यह भी स्थितियों में, जहां कई appdomains देखते हैं के साथ सौदों और अन्य विशेष स्थितियों। मैंने सबसे सामान्य स्थिति के लिए कोड को सरल बना दिया।

+0

दिलचस्प समस्या .. वैसे भी, मैं असेंबली में परिवर्तित हो गया। स्थान और इसका हल हो गया। धन्यवाद :) – Ryan

1

विषम त्रुटि/बग। एक की जगह समारोह या विस्तार पद्धति का उपयोग करके हमेशा सही प्रारूप वापस जाने के लिए के अलावा आप

System.Reflection.Assembly.GetExecutingAssembly().Location 
ExecutablePath के बजाय

उपयोग करने का प्रयास कर सकता है।

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