2012-03-13 2 views
5

Я хочу задать вопрос, чтобы понять разницу между AppDomain и Activator, я загрузил свою DLL через appdomain.CreateInstance. Но я понял, что больше методов для создания экземпляра. Поэтому когда или где я выбираю этот метод? Example1:В чем разница между AppDomain.CreateInstance и 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); 

Example2:

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

Example3:

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

Можете ли вы объяснить, почему мне нужно больше методов или каковы различия?

ответ

2

Из исходного кода sscli2.0, похоже, что метод метода «CreateInstance» в классе AppDomain всегда делегирует вызов Activator.

Единственная цель (почти статические) Активатор класс «Создать» экземпляры различных классов, в то время как AppDomain вводится для совершенно иной (и, возможно, более амбициозны) целей, например:

  1. Легкая установка изоляции;
  2. Оптимизируйте потребление памяти, поскольку AppDomains можно выгрузить.
  3. ...

1-й и 3-й пример просты, так же, как zmbq отметил. Я предполагаю, что ваш второй пример из этого post, где автор показал, как выгрузить устаревший прокси-сервер с помощью AppDomain.

2

Первый создает экземпляр типа Example из примера сборки 'и вызывает на нем MethodA.

Третий создает экземпляр MyType в другом AppDomain

Я не уверен, что второй, я не знаю, что this есть, но кажется создать класс в текущем app-domain - то есть он похож на первый.

Смежные вопросы