2009-08-17 11 views
30

से लोड करने के लिए कैसे करें वेब अनुप्रयोग में, मैं/bin निर्देशिका में सभी असेंबली लोड करना चाहता हूं।अपनी असेंबली को अपनी/bin निर्देशिका

चूंकि इसे फ़ाइल सिस्टम में कहीं भी इंस्टॉल किया जा सकता है, इसलिए मैं एक विशिष्ट पथ को संग्रहीत नहीं कर सकता जहां इसे संग्रहीत किया जाता है।

मैं असेंबली असेंबली ऑब्जेक्ट्स की एक सूची <> चाहता हूं।

उत्तर

35

ठीक है, आप निम्न विधियों के साथ इस हैक कर सकते हैं अपने आप को, शुरू की तरह कुछ का उपयोग करें: अपने वर्तमान विधानसभा के लिए पथ पाने के लिए

string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 

। इसके बाद, एक उपयुक्त फ़िल्टर के साथ Directory.GetFiles विधि का उपयोग कर पथ में सभी डीएलएल पर पुनरावृत्त करें। आपकी अंतिम कोड दिखना चाहिए:

List<Assembly> allAssemblies = new List<Assembly>(); 
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 

foreach (string dll in Directory.GetFiles(path, "*.dll")) 
    allAssemblies.Add(Assembly.LoadFile(dll)); 

कृपया ध्यान दें कि मैं इस ताकि आप की जाँच करने के कि dll वास्तव में पूर्ण पथ है की आवश्यकता हो सकती परीक्षण नहीं किया है (और पथ को श्रेणीबद्ध अगर ऐसा नहीं होता है)

+2

आप शायद यह भी चाहता हूँ यह सुनिश्चित करने के लिए एक चेक जोड़ने के लिए कि आप असेंबली को वास्तव में नहीं चला रहे हैं :) – Wolfwyrd

+8

'पथ' चर में निर्देशिका फ़ाइल नाम शामिल है, इसे' Path.GetDirectoryName (पथ) ' – cjk

+0

के साथ छोटा करने की आवश्यकता है उपरोक्त टिप्पणी को दर्शाने के लिए अद्यतन किया गया है। –

4

आप इसे ऐसा कर सकते हैं, लेकिन आपको शायद इस तरह के मौजूदा एपडोमेन में लोड नहीं करना चाहिए, क्योंकि असेंबली में हानिकारक कोड हो सकता है।

public IEnumerable<Assembly> LoadAssemblies() 
{ 
    DirectoryInfo directory = new DirectoryInfo(@"c:\mybinfolder"); 
    FileInfo[] files = directory.GetFiles("*.dll", SearchOption.TopDirectoryOnly); 

    foreach (FileInfo file in files) 
    { 
     // Load the file into the application domain. 
     AssemblyName assemblyName = AssemblyName.GetAssemblyName(file.FullName); 
     Assembly assembly = AppDomain.CurrentDomain.Load(assemblyName); 
     yield return assembly; 
    } 

    yield break; 
} 

संपादित करें: मैंने कोड का परीक्षण नहीं किया है (इस कंप्यूटर पर विजुअल स्टूडियो तक कोई पहुंच नहीं है), लेकिन मुझे उम्मीद है कि आपको यह विचार मिल जाएगा।

41

बिन निर्देशिका प्राप्त करने के लिए, string path = Assembly.GetExecutingAssembly().Location;नहीं हमेशा काम करता है (विशेष रूप से जब निष्पादन असेंबली को एएसपी.NET अस्थायी निर्देशिका में रखा गया है)।

इसके बजाय, आप string binPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin");

का उपयोग इसके अलावा, आप शायद FileLoadException और BadImageFormatException ध्यान में रखना चाहिए चाहिए।

यहाँ मेरे कार्य समारोह है:

public static void LoadAllBinDirectoryAssemblies() 
{ 
    string binPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin"); // note: don't use CurrentEntryAssembly or anything like that. 

    foreach (string dll in Directory.GetFiles(binPath, "*.dll", SearchOption.AllDirectories)) 
    { 
    try 
    {      
     Assembly loadedAssembly = Assembly.LoadFile(dll); 
    } 
    catch (FileLoadException loadEx) 
    { } // The Assembly has already been loaded. 
    catch (BadImageFormatException imgEx) 
    { } // If a BadImageFormatException exception is thrown, the file is not an assembly. 

    } // foreach dll 
} 
+8

"बिन" निर्देशिका एक तैनात .NET अनुप्रयोग में आवश्यक नहीं होगी । आपको ध्यान रखना चाहिए कि आपका समाधान केवल एएसपी.नेट के लिए काम करता है। – BSick7

+0

"बिन" निर्देशिका का स्थान AppDomain.SetupInfomation ऑब्जेक्ट में स्थित है। इस प्रकार उपयोग करें: var assembliesDir = setup.PrivateBinPathProbe! = Null ? सेटअप। निजीबिनपाथ: सेटअप।ApplicationBase; –

-2

मैं जानता हूँ कि यह एक पुराने सवाल लेकिन है ...

System.AppDomain.CurrentDomain.GetAssemblies()

+9

मेरा मानना ​​है कि यह केवल उन असेंबली को लौटाता है जिन्हें कॉलिंग असेंबली द्वारा संदर्भित किया जाता है (वर्तमान असेंबली सभी विधानसभाएं इस पर निर्भर करती हैं)। यह निष्पादन निर्देशिका में मौजूद सभी असेंबली के समान नहीं है। http://msdn.microsoft.com/en-us/library/system.appdomain.getassemblies.aspx – Jason

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

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