2014-07-21 7 views
5

ताला लगा के बिना उपयोग नेट विधानसभा मैं एक खिड़कियों सेवा है कि एक दिन में एक बार निष्पादित करता है। यह केवल 10 मिनट की कार्रवाई है।dll फ़ाइल

मैं, वेबसाइट के बिन फ़ोल्डर में सेवा की फ़ाइलों का निर्माण क्योंकि सेवा वेबसाइट dll का उपयोग करता है।

दुर्भाग्य से मैंने देखा है कि जब मैं वेबसाइट मॉड्यूल स्थापित (DotNetNuke ज़िप वेबसाइट संस्थापक द्वारा मॉड्यूल) मैं एक त्रुटि है कि फाइल antoher प्रक्रिया द्वारा अवरोधित किया गया है मिला है।

सेवा को अक्षम करने से पहले प्रत्येक मॉड्यूल स्थापित किया गया है बहुत समस्याग्रस्त है इसलिए मैं अपने सेवा dll का जो उस में उपयोग किया जाता है को लॉक नहीं बनाना चाहते हैं।

मैं AppDomain और ShadowCopyFiles विकल्पों के बारे में पढ़ा है, लेकिन मैं उन्हें मेरे लिए काम नहीं कर सकते हैं।

उदाहरण विधानसभा के
class Program 
{ 
    static string GenerateRandomName() 
    { 
     //maybe name must be unique?! 
     var random = new Random(); 
     return "a" + random.Next().ToString() + "b" + random.Next(); 
    } 

    static int RandomNumber() 
    { 
     var info = ConfigureAppDomainSettings(); 

     var domain = AppDomain.CreateDomain(GenerateRandomName(), null, info); 
     var assembly = domain.Load("SharedLibrary"); 
     var shared = (SharedLibrary.IShared)assembly.CreateInstance("SharedLibrary.Shared"); 

     int retVal = shared.RandomNumber(); 

     AppDomain.Unload(domain); 

     domain = null; 
     assembly = null; 
     shared = null; 
     info = null; 

     Console.WriteLine("before cleanning"); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 
     GC.WaitForFullGCComplete(); 
     GC.Collect(); 
     Console.WriteLine("after cleanning"); 

     return retVal; 
    } 

    static AppDomainSetup ConfigureAppDomainSettings() 
    { 
     AppDomainSetup domainSettings = AppDomain.CurrentDomain.SetupInformation; 
     domainSettings.ShadowCopyFiles = "true"; 
     domainSettings.CachePath = @"C:\inetpub\wwwroot\eshop\DesktopModules\Rossnet_EShop\SharedAssemblyTest\PrivateCache"; 

     return domainSettings; 
    } 

    static void Main(string[] args) 
    { 
     Console.WriteLine(RandomNumber()); 

     Console.ReadKey(); 
    } 
} 

कोड::

यह मैं कैसे ShadowCopyFiles का उपयोग का एक उदाहरण है

public interface IShared 
{ 
    int RandomNumber(); 
} 

[Serializable] 
public class Shared : IShared 
{ 
    public int RandomNumber() 
    { 
     var random = new Random(); 
     return random.Next(20); 
    } 
} 

एक निजी कैश बनाया है और नहीं बंद कर दिया और मूल फ़ाइल बंद कर दिया जाता है। < - अभी यह मेरे लिए बेतुका है।

+0

आपका IShared इंटरफ़ेस दोनों appdomains में लोड हो जाता है। जो डीएलएल पर स्थायी ताला लगाता है। साझा कक्षा को इसे किसी अन्य में रखें। –

+0

मैंने पहले इंटरफेस के बजाय गतिशील प्रकार डाला और यह काम नहीं किया, इसलिए यह मेरे कोड के साथ एकमात्र समस्या नहीं है। –

उत्तर

8

यदि आपके पास असेंबली का उपयोग करने वाले सभी कोड को संशोधित करने की पहुंच है, तो उन्हें Assembly.Load ओवरलोड द्वारा लोड करना जो byte[] को चाल करना चाहिए। आप फ़ाइल को स्वयं पढ़ लेंगे, और उसे उस विधि में पास कर देंगे। मैं स्वयं इस दृष्टिकोण का उपयोग करता हूं (हालांकि अन्य कारणों से), और यह मुझे किसी भी समय फ़ाइलों को अपडेट करने की क्षमता देता है।

इसे आसानी से करने का एक तरीका (हालांकि थोड़ा अजीब) आपकी फ़ाइलों का नाम बदलना है (.dll से कुछ और, इसलिए वे नहीं मिल सकते हैं) और फिर AppDomain.AssemblyResolve ईवेंट की सदस्यता लें, जिसे कॉल किया जाएगा वे गायब हैं, जिस बिंदु पर आप अपना कोड प्राप्त कर सकते हैं जो मैन्युअल रूप से असेंबली लोड करता है।