कोड असेंबली का रास्ता मुझे कैसे मिलता है?


780

क्या विधानसभा के लिए रास्ता पाने का एक तरीका है जिसमें वर्तमान कोड रहता है? मुझे कॉलिंग असेंबली का रास्ता नहीं चाहिए, बस एक कोड है।

मूल रूप से मेरी यूनिट टेस्ट को कुछ xml टेस्ट फाइल पढ़ने की जरूरत है जो dll के सापेक्ष स्थित हैं। मैं चाहता हूं कि परीक्षण Dll TestDriven.NET, MbUnit GUI या कुछ और से चलाए जाने की परवाह किए बिना हमेशा सही ढंग से हल हो।

संपादित करें : लोगों को गलतफहमी हो रही है कि मैं क्या पूछ रहा हूं।

मेरा परीक्षण पुस्तकालय कहने में स्थित है

C: \ परियोजनाओं \ myapplication \ daotests \ बिन \ डीबग \ daotests.dll

और मैं इस मार्ग को प्राप्त करना चाहूंगा:

C: \ परियोजनाओं \ myapplication \ daotests \ बिन \ डीबग \

जब तक मैं MbUnit गुई से चलाता हूं, तब तक के तीन सुझाव मुझे विफल करते हैं:

  • Environment.CurrentDirectory देता है \ Program Files \ MbUnit: ग

  • System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location देता है C: \ दस्तावेज़ और सेटिंग्स \ जॉर्ज \ Local Settings \ Temp \ .... \ DaoTests.dll

  • System.Reflection.Assembly.GetExecutingAssembly().Location पिछले की तरह ही देता है।


102
यह आपका समाधान है: var dir = AppDomain.CurrentDomain.BaseDirectory;
जलाल एल-शायर

7
यह स्वीकृत समाधान होना चाहिए। AppDomain.CurrentDomain.BaseDirectory सही दृष्टिकोण है।
बेटरगैमर


2
मैं यहाँ अपने pacakge डायरेक्टरी से JSON फ़ाइल पढ़ने के लिए एक नगेट पैकेज के समाधान की तलाश में आया था। ऐसा लगता है कि जब एक नगेट पैकेज को "AppDomain.CurrentDomain.BaseDirectory" रनिंग प्रॉजेक्ट डायरेक्टरी में पॉइंट किया जाता है, न कि नगेट पैकेज डायरेक्टरी को। इनमें से कोई भी नगेट पैकेज निर्देशिका को सही ढंग से लक्षित नहीं करता है।
लुकास

@ लुकास नहीं, क्योंकि यह सवाल यह नहीं था कि (वास्तव में जब यह पूछा गया था, नगेट मौजूद नहीं था) - एक नया सवाल शुरू करने के लिए बेझिझक और मुझे वहाँ पर पिंग करें लेकिन मैं आपको अभी बता सकता हूं कि ज्यादातर मामलों में यह असंभव है। अधिकांश परियोजनाओं के लिए nuget निर्देशिका sln packagesफ़ाइल के बगल में है। लेकिन जब आप चीजों को संकलित और वितरित करते हैं तो कोई स्लन फ़ाइल नहीं होती है और न ही कोई पैकेज निर्देशिका होती है। संकलन के दौरान, जिन चीजों की आवश्यकता होती है (लेकिन सब कुछ नहीं) को बिन निर्देशिका में कॉपी किया जाता है। आपकी सबसे अच्छी शर्त आपकी इच्छित फ़ाइल को कॉपी करने के लिए एक पोस्टबिल्ड स्क्रिप्ट का उपयोग करना है।
जॉर्ज मौएर

जवाबों:


1035

मैंने निम्नलिखित संपत्ति को परिभाषित किया है क्योंकि हम इसका उपयोग अक्सर इकाई परीक्षण में करते हैं।

public static string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
    }
}

Assembly.Locationसंपत्ति कभी कभी जब NUnit (जहां विधानसभाओं एक अस्थायी फ़ोल्डर से चलाने) का उपयोग कर आप कुछ अजीब परिणाम देता है, तो मैं उपयोग करना पसंद करते हैं CodeBaseजो आपको यूआरआई प्रारूप में पथ देता है, तो UriBuild.UnescapeDataStringनिकाल देता है File://शुरुआत में, और GetDirectoryNameसामान्य विंडो प्रारूप करने के लिए यह परिवर्तन ।


29
यह एक मुद्दा है जो मुझे आया है, यदि आपकी निर्देशिका का नाम है: c: \ My% 20Directory तो Uri.UnescapeDataString वापस आ जाएगी: c: \ My निर्देशिका इसका मतलब है कि File.Exists ("c: \ My My \ MyFile.txt" ") गलत तरीके से वापस आएगा क्योंकि सही रास्ता वास्तव में है" c: \ My% 20Directory \ MyFile.txt "मैं इस पर आया था क्योंकि हमारे SVN रास्तों में जगह होती है और जब हम उन्हें चेक करते हैं तो यह रिक्त स्थान को एनकोड करता है।
row1

5
जब आप इसका उपयोग File.Exist () की जाँच करने के लिए करते हैं तो सावधान रहें क्योंकि यह विधि UNC पथ पर झूठी वापस आ जाएगी। इसके बजाय @ कीथ के उत्तर का उपयोग करें।
अज।

3
नहीं जानता था कि आप जनता के सामने स्थिर रख सकते हैं। यह जानकर अच्छा लगा और मुझे लगता है कि मैं पठनीयता के लिए पसंद करता
हूं

5
नोट: इस नेटवर्क स्थानों के साथ काम नहीं करता है (उदाहरण के लिए \\ REMOT_EPC \ फ़ोल्डर)
Muxa

5
यह भी काम नहीं करेगा अगर निर्देशिका में अंक '#' हैं। विंडोज़ में निर्देशिका और फ़ाइल नामों में संख्या संकेत की अनुमति है।

321

क्या यह मदद करता है?

//get the full location of the assembly with DaoTests in it
string fullPath = System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location;

//get the folder that's in
string theDirectory = Path.GetDirectoryName( fullPath );

मेरा संपादन देखें, यह नहीं है, क्या यह कुछ अजीब है कि कैसे MbUnit चीजें करता है?
जॉर्ज माउर

3
Dml, या संसाधनों के साथ कॉपी की जाने वाली xml फ़ाइलों को सेट करें, dll से पढ़ें।
कीथ

22
या सिर्फtypeof(DaoTests).Assembly
SLaks

4
@SLaks @JohnySkovdal @ कीथ: अरे दोस्तों, इस्तेमाल करते हैं Assembly.GetExecutingAssembly()। इसे "असेंबली मिलती है जिसमें वह कोड होता है जो वर्तमान में निष्पादित हो रहा है" (विधि विवरण से)। मैं अपने ऐडइन "में इस का उपयोग EntitiesToDTOs "। देखें AssemblyHelper.cs वास्तविक उदाहरण के लिए।
kzfabi

4
@ जॉनी सिल्बी द्वारा पोस्ट के साथ एक समस्या थी, क्योंकि यह यूएनसी रास्तों के लिए काम नहीं करता है ... जैसे कि \\ Server \ Folder \ File.ext। इसने एक तरकीब की। +1
ब्लूबेरी

312

यह इस तरह सरल है:

var dir = AppDomain.CurrentDomain.BaseDirectory;

11
यह स्वीकृत समाधान होना चाहिए। AppDomain.CurrentDomain.BaseDirectory सही दृष्टिकोण है।
एबटरगैमर

5
मेरा ध्यान इस ओर वापस लाने के लिए धन्यवाद - यह निश्चित नहीं है कि यदि मैं प्रश्न पूछ रहा था उस समय उपलब्ध था, लेकिन यह अब है।
जॉर्ज मौअर

120
नहीं, यह गलत है। यह वर्तमान में लागू नहीं होने वाले मूल पर्यावरण बिंदु का मार्ग लौटाता है। यदि आपने किसी असेंबली को मैन्युअल रूप से किसी भिन्न पथ से लोड किया है, या यदि इसे GAC से लोड किया गया है, तो यह गलत परिणाम देगा। यह उत्तर सही है: stackoverflow.com/a/283917/243557 क्विकर अभी भी है Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
nathanchere

9
वास्तव में यह वेब अनुप्रयोगों में काम नहीं करेगा, लेकिन जहां तक ​​मुझे लगता है कि निम्नलिखित वृद्धि में किसी भी प्रकार के आवेदन के लिए काम करना चाहिए:AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
इल्या चेर्नोमोर्डिक

4
यह इकाई परीक्षण के लिए उत्कृष्ट है यदि आप बस अपने टेस्ट असेंबली के मूल बिन पथ को प्राप्त करना चाहते हैं (कहते हैं, सबफ़ोल्डर्स में सहायक डेटा फ़ाइलों तक पहुंचने के लिए)। टेस्ट असेंबली आपके कोड का प्रवेश बिंदु है।
मारियोडीएस

68

जॉन के जवाब के रूप में भी, लेकिन थोड़ा कम वर्बोज़ एक्सटेंशन विधि।

public static string GetDirectoryPath(this Assembly assembly)
{
    string filePath = new Uri(assembly.CodeBase).LocalPath;
    return Path.GetDirectoryName(filePath);            
}

अब आप कर सकते हैं:

var localDir = Assembly.GetExecutingAssembly().GetDirectoryPath();

या यदि आप पसंद करते हैं:

var localDir = typeof(DaoTests).Assembly.GetDirectoryPath();

6
क्या आपका मतलब assemblyइसके बजाय था Assembly.GetExecutingAssembly()?
ड्यूड पास्कालो

3
जैसा कि ड्यूड बताते हैं, आप एक तर्क में पारित हुए और इसका उपयोग करने में विफल रहे।
बजे क्रिस मोसची

4
यह जवाब हाथ में लिए सवाल के लिए सिर्फ सादा गलत है। इस उत्तर का एक संशोधित संस्करण आपको दिए गए असेंबली का मार्ग दे सकता है। हालाँकि, यहाँ, हम विशेष रूप से निष्पादित विधानसभा की तलाश कर रहे हैं, और इसलिए विधानसभा में पास होने का कोई मतलब नहीं है। एक विस्तार विधि नौकरी के लिए गलत उपकरण है।
एडवर्ड ब्रे

46

कोडबेस और यूएनसी नेटवर्क शेयरों का उपयोग करते समय मेरे लिए काम करने वाला एकमात्र समाधान था:

System.IO.Path.GetDirectoryName(new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath);

यह सामान्य यूआरआई के साथ भी काम करता है।


5
यह स्वीकृत उत्तर होना चाहिए। यह वास्तव में कष्टप्रद है कि डिफ़ॉल्ट कोडबेस UNC शेयरों को सही तरीके से नहीं संभालता है।
डैनियल गिल्बर्ट

यह तब दुर्घटनाग्रस्त हो जाता है जब फ़ोल्डर में रिक्त स्थान होते हैं और भगवान जानता है कि अन्य वर्ण क्या हैं ...
मारियोडीएस

1
मैं इसे बहुत उपयोग कर रहा हूं और एक ऐसा परिदृश्य मिला है जहां यह विफल हो जाता है: यदि कोड की यह रेखा स्वयं एक NuGet पैकेज का हिस्सा है जो तब एक एप्लिकेशन द्वारा उपयोग किया जाता है! हम बदल कर भी उस परिदृश्य का समर्थन कर सकते GetExecutingAssembly()द्वारा GetCallingAssembly()
तिमो

@Timo: क्या आपने सत्यापित किया है कि इस परिवर्तन के दुष्प्रभाव हैं? यदि ऐसा है तो कृपया फिक्स को शामिल करने के लिए उत्तर को संपादित करें।
इग्नासियो सोलर गार्सिया

@IgnacioSolerGarcia दुख की बात है कि मुझे यह रिपोर्ट करना चाहिए कि यह केवल एक परत गहरी काम करता है, अर्थात यह विफल होता है यदि NuGet पैकेज को दूसरे NuGet पैकेज द्वारा बुलाया गया था! मैं अब इस का उपयोग कर रहा (Chernomordik द्वारा इस पृष्ठ पर एक टिप्पणी से): AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory। पहला भाग वेब अनुप्रयोगों के लिए है, और दूसरा अन्य अनुप्रयोगों के लिए।
तिमो

32

यह काम करना चाहिए, जब तक कि विधानसभा छाया प्रति न हो :

string path = System.Reflection.Assembly.GetExecutingAssembly().Location

14

इस बारे में क्या:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

11

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

इस तरह के एक स्विच प्रत्येक परीक्षण धावक के लिए अलग होने की संभावना है, निश्चित रूप से।

आप विधानसभा अपने परीक्षण के अंदर संसाधन के रूप में अपने XML डेटा embedding विचार किया है?


छाया प्रति के साथ समस्या को इंगित करने के लिए +1। हालाँकि, यह वास्तव में मूल स्थान से निर्धारित करना संभव है Assembly.CodeBase
tm1

11
AppDomain.CurrentDomain.BaseDirectory

MbUnit GUI के साथ काम करता है।


एक asp.net वेब ऐप में रूट डायरेक्टरी के सापेक्ष फाइल लिखने के लिए इसने बहुत काम किया
फिलिप पटल

मैंने पाया है कि यह सबसे अच्छा काम करता है। यदि आप अनिश्चित हैं तो इसे चुनें।
एरिक बर्गस्टेड

10

मेरा मानना ​​है कि यह किसी भी तरह के अनुप्रयोग के लिए काम करेगा:

AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory

1
मेरे प्रयोग इसे सबसे मूर्खतापूर्ण उत्तर दिखाते हैं, जिसमें न केवल वेब और कंसोल अनुप्रयोगों को कवर किया जाता है, बल्कि यूनिट परीक्षणों और नुगेट पैकेजों (किसी भी स्तर पर पुनरावृत्ति के लिए कॉल) से भी कॉल किया जाता है।
तिमो

8

जहां तक ​​मैं बता सकता हूं, अन्य जवाबों में से अधिकांश में कुछ समस्याएं हैं।

डिस्क-आधारित (वेब-आधारित के विपरीत) के लिए ऐसा करने का सही तरीका , गैर-GACed असेंबली वर्तमान में निष्पादित विधानसभा की CodeBaseसंपत्ति का उपयोग करना है।

यह एक URL ( file://) लौटाता है । स्ट्रिंग हेरफेर के साथ खिलवाड़ करने के बजाय या UnescapeDataString, इस की LocalPathसंपत्ति का लाभ उठाकर न्यूनतम उपद्रव के साथ परिवर्तित किया जा सकता है Uri

var codeBaseUrl = Assembly.GetExecutingAssembly().CodeBase;
var filePathToCodeBase = new Uri(codeBaseUrl).LocalPath;
var directoryPath = Path.GetDirectoryName(filePathToCodeBase);

1
यदि पथ समाहित करता है तो काम नहीं करता है #( EscapedCodeBaseकार्य करता है, लेकिन EscapedCodeBase कार्य नहीं करता है यदि पथ में उदाहरण समरूपता है %20(जो कि Windows पथ में अनुमत वर्ण अनुक्रम है)
मार्टिन बा

हम एक NuGet पैकेज में इस कोड को करना चाहते हैं, तो हम बदल कर उस परिदृश्य को ठीक कर सकते GetExecutingAssembly()द्वारा GetCallingAssembly()
तिमो

8

इस बारे में कैसा है ...

string ThisdllDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

फिर बस उसे हैक करें जिसकी आपको आवश्यकता नहीं है



7

यहां जॉन सॉबल के कोड का VB.NET पोर्ट है। Visual Basic केस संवेदी नहीं है, इसलिए उसके कुछ चर नाम टाइप नामों से टकरा रहे थे।

Public Shared ReadOnly Property AssemblyDirectory() As String
    Get
        Dim codeBase As String = Assembly.GetExecutingAssembly().CodeBase
        Dim uriBuilder As New UriBuilder(codeBase)
        Dim assemblyPath As String = Uri.UnescapeDataString(uriBuilder.Path)
        Return Path.GetDirectoryName(assemblyPath)
    End Get
End Property

6

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

यह RELEASE मोड में काम नहीं करेगा, न ही ऑप्टिमाइज़ेशन सक्षम होने के साथ, न ही किसी मशीन से अलग जिस पर इसे संकलित किया गया था।

लेकिन इससे आपको वे रास्ते मिल जाएंगे जो उस स्रोत कोड फ़ाइल के स्थान के सापेक्ष हैं जिसे आप इसे कहते हैं

public static class PathUtilities
{
    public static string GetAdjacentFile(string relativePath)
    {
        return GetDirectoryForCaller(1) + relativePath;
    }
    public static string GetDirectoryForCaller()
    {
        return GetDirectoryForCaller(1);
    }


    public static string GetDirectoryForCaller(int callerStackDepth)
    {
        var stackFrame = new StackTrace(true).GetFrame(callerStackDepth + 1);
        return GetDirectoryForStackFrame(stackFrame);
    }

    public static string GetDirectoryForStackFrame(StackFrame stackFrame)
    {
        return new FileInfo(stackFrame.GetFileName()).Directory.FullName + Path.DirectorySeparatorChar;
    }
}

5

वर्तमान निर्देशिका जहाँ आप मौजूद हैं।

Environment.CurrentDirectory;  // This is the current directory of your application

यदि आप .xml फ़ाइल की प्रतिलिपि बनाते हैं तो आपको इसे ढूंढना चाहिए।

या

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetAssembly(typeof(SomeObject));

// The location of the Assembly
assembly.Location;

इस समस्याग्रस्त अगर विधानसभा में किया गया है हो जाएगा छाया की नकल की
स्पैन

1520! Environment.CurrentDirectoryयदि आप MSBuild कार्य वर्ग में प्रतिबिंब का उपयोग कर रहे हैं, जहां निष्पादित विधानसभा GAC में रहती है और आपका कोड कहीं और है।
वल्केन रावेन

4
सामान्य रूप से CurrentDirectory आपको यह नहीं बताती है कि आपके निष्पादक कहाँ रहते हैं। इसका उपयोग इसके लिए नहीं किया जाता है। यह बस अक्सर होता है एक ही स्थान पर निष्पादन योग्य जगह होती है, इसलिए बहुत सारे प्रोग्रामर अंतर को नहीं समझते हैं। फिर वे कुछ अंत उपयोगकर्ताओं के लिए परेशानी पैदा कर रहे हैं जो उम्मीद करते थे कि एप्लिकेशन को करंटडायरेक्टरी के उचित उपयोग को समझने की उम्मीद है।
बेंट ट्रानबर्ग

5

मैं विधानसभा का उपयोग कर रहा हूं। स्थान के बजाय कोडबेस:

Assembly a;
a = Assembly.GetAssembly(typeof(DaoTests));
string s = a.CodeBase.ToUpper(); // file:///c:/path/name.dll
Assert.AreEqual(true, s.StartsWith("FILE://"), "CodeBase is " + s);
s = s.Substring(7, s.LastIndexOf('/') - 7); // 7 = "file://"
while (s.StartsWith("/")) {
    s = s.Substring(1, s.Length - 1);
}
s = s.Replace("/", "\\");

यह काम कर रहा है, लेकिन मुझे अब यकीन नहीं है कि यह 100% सही है। Http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx पर पेज कहता है:

"कोडबेस उस जगह का URL है जहां फ़ाइल पाई गई थी, जबकि स्थान वह मार्ग है जहां वह वास्तव में भरी हुई थी। उदाहरण के लिए, यदि असेंबली को इंटरनेट से डाउनलोड किया गया था, तो उसका कोडबेस" http: // "से शुरू हो सकता है। , लेकिन इसका स्थान "C: \" से शुरू हो सकता है। यदि फ़ाइल छाया-प्रतिलिपि थी, तो स्थान छाया प्रतिलिपि dir में फ़ाइल की प्रतिलिपि के लिए पथ होगा। यह जानना भी अच्छा है कि कोडबेस की गारंटी नहीं है। जीएसी में विधानसभाओं के लिए सेट किया जाना है। हालांकि, डिस्क से लोड होने वाली विधानसभाओं के लिए स्थान हमेशा निर्धारित रहेगा। "

आप स्थान के बजाय कोडबेस का उपयोग करना चाह सकते हैं।


1
@Kiquenet: एक URI को एक पथ में परिवर्तित करने के लिए इतना कोड। यकीन है कि इसमें सुधार किया जा सकता है। माइक Schall या SoMoS के उत्तर को देखें। आपको स्ट्रिंग स्तर पर यूआरआई को बदलने की कोशिश नहीं करनी चाहिए, बल्कि उपयुक्त वस्तुओं का उपयोग करना चाहिए। ठीक है, यह भी अनाड़ी है कि असेंबली।कोडबसे अधिक उपयुक्त वस्तु के बजाय एक स्ट्रिंग लौटाता है, जैसे कि यूआरआई या फाइलइन्फो।
सात


2

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

यह सिस्टम पर सभी निष्पादित dlls को सूचीबद्ध करेगा, आपको अपने चलने वाले एप्लिकेशन की प्रक्रिया आईडी निर्धारित करने की आवश्यकता हो सकती है, लेकिन यह आमतौर पर बहुत मुश्किल है।

मैंने II के अंदर एक dll के लिए यह कैसे करते हैं, इसका पूरा विवरण लिखा है - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -server /


ध्यान दें कि सबसे पहले, लेख में कोड काफी IIS-केंद्रित है और दूसरा, यह आपको (मुझे विश्वास है) सभी वर्तमान में लोड किए गए dlls हैं, न कि किसी एक समय में क्या चल रहा है।
जॉर्ज मौएर

उदाहरण दिया गया है आईईएस से संबंधित है, लेकिन यदि डीआईएल आईआईएस के बाहर एक प्रक्रिया में चल रहा है तो वही कदम लागू होते हैं। यह सिर्फ प्रक्रिया आईडी की पहचान करने की बात है। मैं यह नोट करने के लिए लेख को अपडेट करूंगा। सलाह के लिये धन्यवाद।
ब्रायन

2

एक विंडोज़ फॉर्म ऐप में, आप बस उपयोग कर सकते हैं Application.StartupPath

लेकिन DLLs और कंसोल ऐप्स के लिए कोड याद रखना बहुत कठिन है ...

string slash = Path.DirectorySeparatorChar.ToString();
string root = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

root += slash;
string settingsIni = root + "settings.ini"


1

यदि किसी पथ में '#' चिह्न है तो आपको गलत निर्देशिका मिलेगी। इसलिए मैं यूरीब्यूस्टल.पैथ और उरीब्यूरी.फैब्रिक का संयोजन करने वाले जॉन सेबल उत्तर के एक संशोधन का उपयोग करता हूं।

public static string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        //modification of the John Sibly answer    
        string path = Uri.UnescapeDataString(uri.Path.Replace("/", "\\") + 
          uri.Fragment.Replace("/", "\\"));
        return Path.GetDirectoryName(path);
     }
}

0

मैंने ये ढूंढ निकाला। वेब प्रोजेक्ट्स के बीच, यूनिट टेस्ट (ननिट और रीशर टेस्ट रनर) ; मैंने पाया कि यह मेरे लिए काम कर रहा है।

मुझे यह पता लगाने के लिए कोड की तलाश है कि बिल्ड में क्या कॉन्फ़िगरेशन है Debug/Release/CustomName। काश #if DEBUG,। तो अगर कोई इसे सुधार सकता है !

बेझिझक संपादित करें और सुधार करें।

एप्लिकेशन फ़ोल्डर हो रही है । वेब जड़ों के लिए उपयोगी, परीक्षण फ़ाइलों का फ़ोल्डर प्राप्त करने के लिए unittests।

public static string AppPath
{
    get
    {
        DirectoryInfo appPath = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);

        while (appPath.FullName.Contains(@"\bin\", StringComparison.CurrentCultureIgnoreCase)
                || appPath.FullName.EndsWith(@"\bin", StringComparison.CurrentCultureIgnoreCase))
        {
            appPath = appPath.Parent;
        }
        return appPath.FullName;
    }
}

बिन फ़ोल्डर प्राप्त करना : प्रतिबिंब का उपयोग करके विधानसभाओं को निष्पादित करने के लिए उपयोगी। यदि बिल्ड संपत्तियों के कारण फ़ाइलें वहां कॉपी की जाती हैं।

public static string BinPath
{
    get
    {
        string binPath = AppDomain.CurrentDomain.BaseDirectory;

        if (!binPath.Contains(@"\bin\", StringComparison.CurrentCultureIgnoreCase)
            && !binPath.EndsWith(@"\bin", StringComparison.CurrentCultureIgnoreCase))
        {
            binPath = Path.Combine(binPath, "bin");
            //-- Please improve this if there is a better way
            //-- Also note that apps like webapps do not have a debug or release folder. So we would just return bin.
#if DEBUG
            if (Directory.Exists(Path.Combine(binPath, "Debug"))) 
                        binPath = Path.Combine(binPath, "Debug");
#else
            if (Directory.Exists(Path.Combine(binPath, "Release"))) 
                        binPath = Path.Combine(binPath, "Release");
#endif
        }
            return binPath;
    }
}

0

यह काम करना चाहिए:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
Assembly asm = Assembly.GetCallingAssembly();
String path = Path.GetDirectoryName(new Uri(asm.EscapedCodeBase).LocalPath);

string strLog4NetConfigPath = System.IO.Path.Combine(path, "log4net.config");

मैं कुछ कॉन्फ़िगरेशन फ़ाइल के साथ DLL फ़ाइल लाइब्रेरीज़ को परिनियोजित करने के लिए इसका उपयोग कर रहा हूं (यह DLL फ़ाइल के भीतर से log4net का उपयोग करने के लिए है)।


क्या fileMapयहाँ के लिए प्रयोग किया जाता है?
जॉर्ज मौअर

0

मुझे अपना समाधान स्थान की पुनर्प्राप्ति के लिए पर्याप्त लगता है।

var executingAssembly = new FileInfo((Assembly.GetExecutingAssembly().Location)).Directory.FullName;

यह पहले से ही शीर्ष-रेटेड उत्तरों में से एक है और इस प्रश्न में स्पष्ट रूप से उल्लेख किया गया है कि कुछ इस स्थिति में काम नहीं करता है।
जॉर्ज माउर

माफी को याद किया जाना चाहिए! जाहिर है मैं पूरी तरह से नहीं पढ़ा था।
तेज विंगफील्ड

0

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

यहां छवि विवरण दर्ज करें

शायद TestDriven.NETऔर MbUnitजीयूआई में एक ही सेटिंग है।


-3

मैं बिन निर्देशिका के लिए रास्ता पाने के लिए इसका उपयोग करता हूं:

var i = Environment.CurrentDirectory.LastIndexOf(@"\");
var path = Environment.CurrentDirectory.Substring(0,i); 

आपको यह परिणाम मिलेगा:

"c: \ users \ ricooley \ documents \ Visual Studio 2010 \ Projects \ Windows_Test_Project \ Windows_Test_Project \ bin"


6
मुझे यहां Path.getDirectoryName से बचने का कोई कारण नहीं दिखता है
Max Keller

@MaxKeller यदि आप कारण नहीं देखते हैं, तो इसका मतलब यह नहीं है कि यह सही है। Path.GetDirectoryName का यह वैकल्पिक तरीका दस गुना तेज है।
रुस्लान वेसेलोव

-3

वेब एप्लीकेशन?

Server.MapPath("~/MyDir/MyFile.ext")

2
@christiandev यह एक उत्तर है लेकिन यह गलत प्रश्न का उत्तर प्रतीत होता है। इस सवाल से यह स्पष्ट है कि यह एक वेब एप्लीकेशन नहीं है बल्कि एक विधानसभा है जो MbUnit के साथ चलाई जा रही है। यह कहा जा रहा है, आस्पेक्ट नेट छाया प्रतिलिपि की वजह से उत्तर अभी भी सही नहीं है (हालांकि यह अनुमान लगा सकता है कि कोई व्यक्ति इस प्रश्न पर उतर रहा है)।
जॉर्ज मौअर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.