2009-06-08 15 views
7

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

एएसपी.Net वेब अनुप्रयोगों के लिए, यह थोड़ा गिलहरी है। मुझे यह 99.99% काम मिल गया है। वर्तमान पद्धति कुछ इस तरह काम कर रहा है:

public class AppDomainManager : System.AppDomainManager 
{ 
    PhantomAssemblyLoader m_phantomAssemblyLoader; 
    public AppDomainManager() 
    { 
     m_phantomAssemblyLoader = new PhantomAssemblyLoader(); 
    } 

    public override void InitializeNewDomain(AppDomainSetup appDomainInfo) 
    { 
     m_phantomAssemblyLoader.Attach(AppDomain.CurrentDomain); 
    } 
} 

public class PhantomAssemblyLoader 
{ 
    public PhantomAssemblyLoader() 
    { 
    } 

    public void Attach(AppDomain appDomain) 
    { 
     appDomain.AssemblyResolve += new ResolveEventHandler(AssemblyResolve); 
     appDomain.DomainUnload += new EventHandler(DomainUnload); 
    } 

    public void Detach(AppDomain appDomain) 
    { 
     appDomain.AssemblyResolve -= AssemblyResolve; 
     appDomain.DomainUnload -= DomainUnload; 
    } 

    void DomainUnload(object sender, EventArgs e) 
    { 
     this.Detach(sender as AppDomain); 
    } 

    private Assembly AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     Assembly asssembly = Assembly.Load(BlackMagic.GetBytes(sender, args)); 
     return asssembly; 
    } 
} 

समस्या हो कि एक नया AppDomain instantiated और प्रत्येक पृष्ठ लोड के लिए उतार दिया है लगता है। उपर्युक्त कोड आवश्यक असेंबली लोड करता है, इसे अनलोड करता है, इसे फिर से लोड करता है और इसी तरह। मुझे पता है कि यह हो रहा है क्योंकि इन प्रेत विधानसभाओं के भीतर स्थिर डेटा पेज लोड के बीच नहीं रहता है।

सही समाधान इन प्रेत विधानसभाओं को उसी संदर्भ में लोड कर सकता है जैसे/bin फ़ोल्डर में पाए गए असेंबली। ये तब शुरू होते हैं जब एप्लिकेशन शुरू होता है और सत्र के दौरान कभी भी अनलोड नहीं किया जाता है।

+0

मुझे अभी भी समझ में नहीं आता कि आप क्या हासिल करने की कोशिश कर रहे हैं। क्या आप एक उदाहरण लिख सकते हैं जो आवश्यकता और WinForm समाधान का प्रदर्शन करता है? –

उत्तर

11

आप documentation on AppDomainManager पढ़ यदि आप एक नोट देखेंगे:

ASP.NET में एक आवेदन डोमेन कॉन्फ़िगर करने के लिए AppDomainManager प्रयोग न करें। एएसपी.नेट में, कॉन्फ़िगरेशन को मेजबान द्वारा संभाला जाना चाहिए।

इसलिए, आपको AppDomainManager को अनुकूलित करने के लिए पर्यावरण चर या रजिस्ट्री का उपयोग नहीं करना चाहिए।

मेरा मानना ​​है कि आप एपडोमेन.क्यूरेंटडोमेन में असेंबली रीसोल्व इवेंट हैंडलर जोड़कर जो चाहते हैं उसे प्राप्त कर सकते हैं। मैंने सरल वेबसाइट बनाई और यह अपेक्षा के अनुसार काम करता है - गतिशील असेंबली पृष्ठ लोड के बीच अनलोड नहीं होती है।

protected void Page_Load(object sender, EventArgs e) 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(AssemblyResolve); 
    Assembly assembly = Assembly.Load("PhantomAssembly"); 
    Type t = assembly.GetType("PhantomAssembly.Test"); 
    MethodInfo m = t.GetMethod("GetIt"); 
    Response.Write(m.Invoke(null, null)); 
    t.GetMethod("IncrementIt").Invoke(null, null); 
} 

private static Assembly AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    Assembly asssembly = Assembly.Load(File.ReadAllBytes(@"C:\PhantomAssembly.dll")); 
    return asssembly; 
} 
+0

आपके समय के लिए धन्यवाद। एक बार मेरे अनुसूची परमिट के बाद मैं इसे एक शॉट दूंगा। –

1

यदि समस्या यह है कि ऐपडोमेन प्रत्येक पृष्ठ अनुरोध पर बनाया और नष्ट हो रहा है, निश्चित रूप से इसे एएसपी.NET आवेदन स्थिति में संदर्भित करके हल किया जा सकता है। उदाहरण के लिए आप ग्लोबल.एक्सएक्स में इसे एक बार बना सकते हैं।

+0

यह कैसे किया जाता है? –

+0

global.asax में एक संदर्भ बनाना मेरी समस्या का समाधान नहीं किया। –

1

आप ASP.NET Application Life Cycle पर एमएसडीएन आलेख को देखना चाहेंगे और एप्लिकेशन_स्टार्ट ईवेंट में अपनी असेंबली लोड करने की जांच कर सकते हैं।

0

My solution इसी तरह की समस्या के लिए सहायक हो सकता है।

+1

आप समाधान Winforms डोमेन में रहते हैं। यह मेरी समस्या नहीं है। मेरी समस्या नेट वेब अनुप्रयोगों के लिए विशिष्ट है। –

+0

एएसपी .NET के लिए एक समाधान प्रदान करें। –

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