Assembly.CodeBase होनहार लग रहा है, लेकिन यह एक यूएनसी पथ यहां है:
कि यह कुछ का अनुमान है ध्यान दें है एक file uri, एक UNC path नहीं।
आप हाथ से स्ट्रिंग मैनिपुलेशन करके इसे हल करते हैं। गंभीरता से।
आप निम्नलिखित निर्देशिका (शब्दशः) के साथ इतने पर पा सकते हैं अन्य सभी तरीकों का प्रयास करें:
C:\Test\Space()(h#)(p%20){[a&],[email protected],p%,+}.,\Release
यह एक वैध, अगर कुछ हद तक असामान्य, विंडोज मार्ग है। (कुछ लोगों को या तो वहाँ रास्तों में इन पात्रों में से एक, का अधिकार होगा, और आप आप विधि उन सभी के लिए काम करने के लिए चाहेगा?)
उपलब्ध कोड बेस (we do not want Location
, right?) गुण तो (पर हैं मेरे विन 7 के साथ।नेट 4):
assembly.CodeBase -> file:///C:/Test/Space()(h#)(p%20){[a&],[email protected],p%,+}.,/Release
assembly.EscapedCodeBase -> file:///C:/Test/Space(%20)(h%23)(p%20)%7B%5Ba%26%5D,[email protected],p%,+%7D.,/Release
आप ध्यान देंगे:
CodeBase
भाग निकले नहीं है सब पर, यह सिर्फ नियमित रूप से स्थानीय पथ file:///
लगी होती है और बैकस्लैश बदल दिया। इस प्रकार, यह System.Uri
पर इसे खिलाने के लिए काम नहीं करता है।
EscapedCodeBase
पूरी तरह से भाग निकले नहीं है (मैं नहीं जानते हैं कि यह एक बग है या अगर यह URI scheme की एक कमी है):
- नोट कैसे अंतरिक्ष चरित्र (
) %20
- करने के लिए अनुवाद लेकिन
%20
अनुक्रम भी%20
पर अनुवाद करता है! (प्रतिशत %
बिल्कुल से बच नहीं है)
- कोई भी इस उलझन में मूल को पुनर्निर्माण कर सकता है!
स्थानीय फ़ाइलों के लिए
(और है कि वास्तव में सब है मैं, CodeBase
सामान के लिए के बारे में परवाह करता हूँ क्योंकि अगर फ़ाइल स्थानीय नहीं है, तो आप शायद .Location
मेरे लिए वैसे भी निम्नलिखित कार्यों का उपयोग करना चाहते हैं (ध्यान दें कि यह नहीं है सबसे सुंदर या तो:
public static string GetAssemblyFullPath(Assembly assembly)
{
string codeBasePseudoUrl = assembly.CodeBase; // "pseudo" because it is not properly escaped
if (codeBasePseudoUrl != null) {
const string filePrefix3 = @"file:///";
if (codeBasePseudoUrl.StartsWith(filePrefix3)) {
string sPath = codeBasePseudoUrl.Substring(filePrefix3.Length);
string bsPath = sPath.Replace('/', '\\');
Console.WriteLine("bsPath: " + bsPath);
string fp = Path.GetFullPath(bsPath);
Console.WriteLine("fp: " + fp);
return fp;
}
}
System.Diagnostics.Debug.Assert(false, "CodeBase evaluation failed! - Using Location as fallback.");
return Path.GetFullPath(assembly.Location);
}
मुझे यकीन है एक बेहतर समाधान के साथ आ सकता है कर रहा हूँ शायद एक भी एक समाधान है कि उचित URL एन/CodeBase
संपत्ति अगर की डिकोडिंग करता है के साथ आ सकता है यह एक स्थानीय मार्ग है, लेकिन यह देखते हुए कि कोई भी file:///
को बंद कर सकता है डी इसके साथ किया जा सकता है, मैं कहूंगा कि यह समाधान काफी अच्छा है, अगर निश्चित रूप से वास्तव में बदसूरत है।
संभावित डुप्ल आईसीएटी [क्या फाइल यूआरआई को ड्राइव अक्षरों के साथ पथ में बदलने के लिए एक .NET Framework विधि है?] (http://stackoverflow.com/questions/278761/is-there-a-net-framework-method-for-converting- फ़ाइल-यूरिस-टू-पथ-साथ-ड्राइव-ले) – nawfal