वर्तमान में निष्पादित होने वाले DLL का स्थान कैसे प्राप्त करें?


93

मेरे पास एक विन्यास फाइल है जिसे मुझे लिखने वाले dll के निष्पादन के भाग के रूप में लोड करने की आवश्यकता है।

मेरे पास जो समस्या है, वह यह है कि जिस स्थान पर मैंने dll और config फाइल रखी है, वह ऐप चालू होने पर "वर्तमान स्थान" नहीं है।

उदाहरण के लिए, मैंने dll और xml फ़ाइल यहाँ रखी:

D: \ Program Files \ Microsoft टीम फाउंडेशन सर्वर 2010 \ Application Tier \ Web Services \ bin \ Plugins

लेकिन अगर मैं इस तरह से xml फ़ाइल (मेरे डीएल में) को संदर्भित करने की कोशिश करता हूं:

XDocument doc = XDocument.Load(@".\AggregatorItems.xml")

तब । \ AggregatorItems.xml इसका अनुवाद करता है:

सी: \ windows \ system32 \ inetsrv \ AggregatorItems.xml

इसलिए, मुझे यह जानने का एक तरीका (मैं आशा) खोजने की आवश्यकता है कि वर्तमान में निष्पादित होने वाली डीएल कहाँ स्थित है। मूल रूप से मैं यह देख रहा हूँ:

XDocument doc = XDocument.Load(CoolDLLClass.CurrentDirectory+@"\AggregatorItems.xml")

जवाबों:


137

आप क्या देख रहे हैं System.Reflection.Assembly.GetExecutingAssembly()

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string xmlFileName = Path.Combine(assemblyFolder,"AggregatorItems.xml");

ध्यान दें:

.Locationसंपत्ति वर्तमान में चल रहे DLL फ़ाइल का स्थान देता है।

कुछ शर्तों के तहत निष्पादन से पहले DLL छाया प्रति है, और .Locationसंपत्ति कॉपी का मार्ग वापस कर देगी। यदि आप मूल DLL का पथ चाहते हैं, तो Assembly.GetExecutingAssembly().CodeBaseइसके बजाय संपत्ति का उपयोग करें ।

.CodeBaseएक उपसर्ग ( file:\) शामिल है, जिसे आपको निकालने की आवश्यकता हो सकती है।


8
अफसोस! वह लौटता हैC:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
वैकैनो

23
आह! लेकिन Assembly.GetExecutingAssembly().CodeBaseहै!
वैकैनो

2
CodeBase ने मुझे फाइल दी: \\ c: \ myassemblypath, जो अजीब है
मैट

10
@Matt नए Uri (असेंबली .GetExecutingAssembly ()। CodeBase) .LocalPath का उपयोग वास्तविक नाम पाने के लिए करता है
लैरी

2
string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
मार्टिन कॉनेल

36

प्रतिबिंब आपका मित्र है, जैसा कि बताया गया है। लेकिन आपको सही विधि का उपयोग करने की आवश्यकता है;

Assembly.GetEntryAssembly()     //gives you the entrypoint assembly for the process.
Assembly.GetCallingAssembly()   // gives you the assembly from which the current method was called.
Assembly.GetExecutingAssembly() // gives you the assembly in which the currently executing code is defined
Assembly.GetAssembly( Type t )  // gives you the assembly in which the specified type is defined.

16

मेरे मामले में (मेरी असेंबली के साथ लोड [आउटलुक में फ़ाइल के रूप में)):

typeof(OneOfMyTypes).Assembly.CodeBase

CodeBase(नहीं Location) के उपयोग पर ध्यान दें Assembly। अन्य लोगों ने विधानसभा का पता लगाने के वैकल्पिक तरीकों को इंगित किया है।



1

यदि आप एक asp.net एप्लिकेशन के साथ काम कर रहे हैं और आप डिबगर का उपयोग करते समय असेंबलियों का पता लगाना चाहते हैं, तो उन्हें आमतौर पर कुछ अस्थायी निर्देशिका में डाल दिया जाता है। मैंने इस पद्धति को उस परिदृश्य के साथ मदद करने के लिए लिखा था।

private string[] GetAssembly(string[] assemblyNames)
{
    string [] locations = new string[assemblyNames.Length];


    for (int loop = 0; loop <= assemblyNames.Length - 1; loop++)       
    {
         locations[loop] = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic && a.ManifestModule.Name == assemblyNames[loop]).Select(a => a.Location).FirstOrDefault();
    }
    return locations;
}

अधिक जानकारी के लिए इस ब्लॉग पोस्ट को देखें http://nodogmablog.bryanhogan.net/2015/05/finding-the-location-of-a-running-assembly-in-net/

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.