2009-06-08 14 views
7

Sto scrivendo un prototipo per dimostrare la fattibilità di qualcosa su cui sto lavorando. Fondamentalmente, richiede il caricamento degli assembly non su disco in un dominio dell'applicazione. In superficie, sembra facile. In effetti, è un gioco da ragazzi nel mondo WinForms in cui un processo è un processo.Come caricare dinamicamente gli assembly non su disco in un'applicazione Web ASP .Net?

Per le applicazioni Web ASP.Net, è un po 'squirreloso. Ho funzionato al 99,99%. Il metodo attuale è alquanto funziona così:

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; 
    } 
} 

Il problema sembra essere che un nuovo dominio di applicazione è istanziata e scaricato per ogni caricamento della pagina. Il codice sopra carica l'assembly richiesto, lo scarica, lo carica di nuovo e così via. So che questo sta accadendo perché i dati statici all'interno di questi gruppi fantasma non persistono tra i carichi di pagina.

La soluzione corretta può caricare questi gruppi fantasma nello stesso contesto di quegli assembly trovati nella cartella/bin. Questi vengono caricati all'avvio dell'applicazione e non vengono mai scaricati durante la sessione.

+0

Ancora non capisco cosa stai cercando di raggiungere. Puoi scrivere un esempio che dimostri la necessità e la soluzione WinForm? –

risposta

11

Se leggete documentation on AppDomainManager vedrete una nota:

Non utilizzare AppDomainManager per configurare un dominio applicazione in ASP.NET. In ASP.NET, la configurazione deve essere gestita dall'host.

Pertanto, non è consigliabile utilizzare variabili di ambiente o registro per personalizzare AppDomainManager.

Credo che si possa ottenere ciò che si desidera semplicemente aggiungendo il gestore di eventi AssemblyResolve ad AppDomain.CurrentDomain. Ho creato un sito Web semplice e funziona come previsto: l'assembly dinamico non viene scaricato tra i carichi di pagina.

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

Grazie per il tuo tempo. Darò questo un colpo una volta che il mio programma lo permette. –

1

Se il problema è che AppDomain viene creato e distrutto su ogni richiesta di pagina, sicuramente ciò può essere risolto tenendo un riferimento ad esso nello stato dell'applicazione ASP.NET. Ad esempio, è possibile crearlo una volta nel Global.asax.

+0

Come è fatto? –

+0

La creazione di un riferimento in global.asax non ha risolto il mio problema. –

0

My solution a un problema simile può essere utile.

+1

La soluzione sembra vivere nel dominio winforms. Questo non è un mio problema. Il mio problema è specifico delle applicazioni Web .Net. –

+0

Fornire una soluzione per Asp .Net. –

Problemi correlati