2012-03-13 13 views
5

Vorrei fare una domanda per capire la differenza tra AppDomain e Activator, ho caricato la mia DLL tramite appdomain.CreateInstance. Ma ho capito che più metodo per creare istanze. Quindi quando o dove scelgo questo metodo? Esempio 1:Qual è la differenza tra AppDomain.CreateInstance e Activator.CreateInstance?

// Use the file name to load the assembly into the current 
    // application domain. 
    Assembly a = Assembly.Load("example"); 
    // Get the type to use. 
    Type myType = a.GetType("Example"); 
    // Get the method to call. 
    MethodInfo myMethod = myType.GetMethod("MethodA"); 
    // Create an instance. 
    object obj = Activator.CreateInstance(myType); 
    // Execute the method. 
    myMethod.Invoke(obj, null); 

Esempio 2:

public WsdlClassParser CreateWsdlClassParser() 
{ 
    this.CreateAppDomain(null); 

    string AssemblyPath = Assembly.GetExecutingAssembly().Location; 
    WsdlClassParser parser = null; 
    try 
    {     
     parser = (WsdlClassParser) this.LocalAppDomain.CreateInstanceFrom(AssemblyPath, 
              typeof(Westwind.WebServices.WsdlClassParser).FullName).Unwrap() ;     
    } 
    catch (Exception ex) 
    { 
     this.ErrorMessage = ex.Message; 
    }       
    return parser; 
} 

Esempio3:

private static void InstantiateMyTypeSucceed(AppDomain domain) 
{ 
    try 
    { 
     string asmname = Assembly.GetCallingAssembly().FullName; 
     domain.CreateInstance(asmname, "MyType"); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(); 
     Console.WriteLine(e.Message); 
    } 
} 

Può spiegare perché ho bisogno di più metodi o quali sono le differenze?

risposta

2

Dal codice sorgente sscli2.0, sembra che le chiamate al metodo "CreateInstance" nella classe AppDomain delegano sempre la chiamata a Activator.

L'unico scopo della (quasi statico) Activator classe è quello di "creare" le istanze di varie classi, mentre AppDomain viene introdotto per la ben diversa (e forse più ambizioso) scopi, ad esempio:

  1. Un'unità leggera di isolamento dell'applicazione;
  2. Ottimizza il consumo di memoria perché AppDomains può essere scaricato.
  3. ...

Il 1 ° e il 3 ° ad esempio sono semplici, proprio come zmbq notato. Immagino che il tuo secondo esempio provenga da questo post, in cui l'autore mostra come scaricare un proxy non aggiornato utilizzando AppDomain.

2

Il primo crea un'istanza di tipo Example dall'assembly 'example' e chiama MethodA su di esso.

Il terzo si crea un'istanza di MyType in un diverso AppDomain

Non sono sicuro circa la seconda, non so che cosa è this, ma sembra per creare una classe nella corrente app-domain - cioè, è simile al primo.