2012-03-13 13 views
5

Quiero hacer una pregunta para ver la diferencia entre AppDomain y Activator, cargué mi dll a través de appdomain.CreateInstance. Pero me di cuenta de que había más métodos para crear una instancia. Por lo tanto, ¿cuándo o dónde elijo este método? Ejemplo 1:¿cuál es la diferencia entre AppDomain.CreateInstance y 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); 

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

Ejemplo 3:

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

¿Puede explicar por qué necesito más métodos o cuáles son las diferencias?

Respuesta

2

Desde el código fuente sscli2.0, parece que las llamadas al método "CreateInstance" en AppDomain la clase siempre delega la llamada al Activator.

El único propósito de la (casi estática) Activador clase es "crear" instancias de distintas clases, mientras que dominio de aplicación se introduce para fines muy diferentes (y tal vez más ambicioso), por ejemplo:

  1. Una unidad liviana de aislamiento de aplicaciones;
  2. Optimice el consumo de memoria porque AppDomains puede descargarse.
  3. ...

La primera y la tercera son sencillos ejemplo, al igual que zmbq señaló. Supongo que su segundo ejemplo es de este post, donde el autor mostró cómo descargar un proxy desactualizado usando AppDomain.

2

El primero crea una instancia del tipo Example del ensamblado 'example' y llama al MethodA.

La tercera se crea una instancia de MyType de una manera diferente AppDomain

No estoy seguro sobre el segundo, no sé lo que es this, pero parece para crear una clase en la corriente dominio de la aplicación, es decir, es similar al primero.

Cuestiones relacionadas