В чем разница между AppDomain.CreateInstance и Activator.CreateInstance? - PullRequest
6 голосов
/ 13 марта 2012

Я хочу задать вопрос, чтобы понять разницу между AppDomain и Activator, я загрузил свою dll через appdomain.CreateInstance.Но я понял, что еще способ создать экземпляр.Поэтому когда или где мне выбрать этот метод?Пример1:

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

Пример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;
}

Пример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);
    }
}

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

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Исходный код sscli2.0 выглядит как вызовы метода "CreateInstance" в AppDomain класс всегда делегирует вызов Activator .

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

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

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

2 голосов
/ 13 марта 2012

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

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

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

...