2011-04-15 12 views
5

तो यहां स्थिति है:असेंबली फ़ाइल नामकरण और असेंबली। लोडफाइल

मेरे पास Lib1.dll नामक एक असेंबली है। कुछ कारणों से (प्रश्न के लिए प्रासंगिक नहीं) मुझे असेंबली फ़ाइल नाम का नाम बदलकर Lib1New.dll में बदलना पड़ा, अब विधानसभा का उपयोग करके नामित असेंबली लोड करने का प्रयास करते समय .LoadFile मैंने देखा कि सीएलआर Lib1.dll को भी लोड करने का प्रयास करता है।

यदि खोज पथ में Lib1.dll पाया जाता है तो यह पता स्थान में लोड हो जाता है। यह आवेदन ठीक है कि क्या Lib1.dll पाया गया था या नहीं। (समस्या यह है कि यदि Lib1.dll पाया जाता है तो फ़ाइल लॉक हो जाती है और अन्य प्रक्रियाओं द्वारा हटाया नहीं जा सकता है)।

enter image description here

मुझे समझ नहीं आता क्यों LoadFile खोजों और भार Lib1.dll। लोडफाइल निर्दिष्ट स्थान पर एक असेंबली फ़ाइल की सामग्री लोड करना है, यह फ़ाइलों की खोज क्यों कर रहा है। LoadFile के लिए

MSDN प्रलेखीकरण:

उपयोग LoadFile विधि लोड करने के लिए और विधानसभाओं में एक ही पहचान है कि जांच करते हैं, लेकिन अलग अलग रास्तों में स्थित हैं। LoadFile लोडफ्रॉम संदर्भ में फ़ाइलों को लोड नहीं करता है, और लोड पथ का उपयोग करके निर्भरता को हल नहीं करता है, क्योंकि LoadFrom विधि करता है। लोडफाइल इस सीमित परिदृश्य में उपयोगी है क्योंकि लोडफ्रम का उपयोग उन असेंबली को लोड करने के लिए नहीं किया जा सकता है जिनके समान पहचान हैं लेकिन अलग-अलग पथ हैं; यह केवल पहली ऐसी असेंबली लोड करेगा।

उत्तर

2

मेरा सुझाव है कि आप अपनी समस्या का सरलीकरण करने का प्रयास करें क्योंकि मैंने अभी आपकी स्थिति को पुन: उत्पन्न करने की कोशिश की है और कोई समस्या नहीं आई है। मैंने एक Lib.dll असेंबली बनाई, इसे संकलित किया, एक कंसोल एप्लिकेशन बनाया जो इसे लोडफाइल के साथ लोड करता था, फिर इसका नाम बदलकर Lib.dll और कंसोल का संदर्भ "LibNew.dll" कर दिया गया। फिर मैंने lib.dll को फिर से संकलित किया और कंसोल एप्लिकेशन चलाया। उस समय मैं LibNew.dll को हटाने में असमर्थ था, लेकिन मैं Lib.dll को हटाने में सक्षम था।

मुझे संदेह है कि आपका Lib.dll संभवतः अपनी असेंबली से कुछ जानकारी लोड कर रहा है, और यह आंतरिक रूप से ऐसा करने के लिए एक और लोड फ़ंक्शन का उपयोग कर रहा है, जो मूल Lib.dll को ढूंढने के समाप्त होता है। लेकिन अगर आपके पास बहुत ही सरल डीएलएल है, तो वह अतिरिक्त भार नहीं करेगा। मेरे डीएलएल में एक फ़ंक्शन है, जिसे मैं कॉल करने में सक्षम था, लेकिन मैंने अभी भी ऊपर दिए गए मेरे परिणाम दिखाए।

कंसोल आवेदन::

class Program 
{ 
    static void Main(string[] args) 
    { 
     System.Reflection.Assembly assy = System.Reflection.Assembly.LoadFile(args[0]); 
     Type class1 = assy.GetType("Lib.Class1"); 

     System.Reflection.MethodInfo myMethod = class1.GetMethod("MyMethod"); 
     Console.WriteLine(myMethod.Invoke(null, new object[] {"This is a string"}).ToString()); 

     Console.ReadLine(); 
    } 
} 

लिब:

namespace Lib 
{ 
public class Class1 
{ 
    public static string MyMethod(string param) 
    { 
     return "Fixed: [" + param.Replace(" ", "-") + "]"; 
    } 
} 
} 

निगरानी सिर्फ LoadImage कहता है, मुझे लगता है कि यह Lib.dll लोड करने का प्रयास नहीं किया: यहाँ मेरी कोड है Process Monitor Trace of LoadImage calls

हालांकि, सभी घटनाओं की निगरानी, ​​मुझे लगता है कि यह आवेदन में lib.dll के लिए जांच direc अनुदारपंथी। Process Monitor Trace of all references to Debug\Lib

शायद यदि आप DLL को किसी अन्य निर्देशिका में डालते हैं तो आप जिस व्यवहार को चाहते हैं उसे मजबूर कर सकते हैं? दस्तावेज पर विचार करते हुए, यह अजीब व्यवहार है।

+0

धन्यवाद BlueMonkMN, यह कुछ समझ में आता है। यदि लाइब्रेरी गतिशील रूप से लोड हो रही है तो मूल लाइब्रेरी को लोड करना संभव है, लेकिन पोस्ट मॉनिटर लॉग जो मैंने पोस्ट के साथ संलग्न किया था, सिस्टम का उपयोग कर निम्नलिखित Lib1 का उपयोग करके उत्पादित किया गया था; नेमस्पेस लिब 1 { पब्लिक क्लास क्लास 1 { सार्वजनिक शून्य SayHello() { कंसोल। राइटलाइन ("कक्षा 1 :: SayHello"); } } } क्या आप प्रक्रिया मॉनीटर चला सकते हैं और जांच सकते हैं कि कंसोल ऐप दोनों डीएलएस लोड करने की कोशिश कर रहा है या नहीं। –

+0

ऐसा लगता है कि यह इसे नहीं ढूंढ रहा था क्योंकि मेरे पास एप्लिकेशन निर्देशिका के अलावा किसी अन्य निर्देशिका में DLL था। – BlueMonkMN

1

LoadFile विंडोज फ़ाइल खोज का उपयोग करता है, न कि .NET के असेंबली रिज़ॉल्यूशन। लेकिन यह अभी भी फाइल की खोज करता है।

यह new FileStream() पर कॉल करने के समान है, जहां आप फ़ाइल नाम पास कर सकते हैं और यदि यह एक सापेक्ष पथ है तो यह इसे पाथ, आदि में देखेगा।

+0

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