В чем разница между этими вызовами?
Разница между Assembly.CreateInstance и Activator.CreateInstance?
Ответ 1
Отсутствует. Assembly.CreateInstance фактически вызывает Activator.CreateInstance под капотом.
Использование рефлектора на Assembly.CreateInstance:
public object CreateInstance(string typeName, bool ignoreCase, BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture, object[] activationAttributes)
{
Type type = this.GetType(typeName, false, ignoreCase);
if (type == null)
{
return null;
}
return Activator.CreateInstance(type, bindingAttr, binder, args, culture, activationAttributes);
}
Ответ 2
Assembly.CreateInstance
ищет тип в конкретной сборке, тогда как Activator.CreateInstance
может создать объект любого типа.
Activator.CreateInstance
имеет перегрузки, которые Assembly
не имеет; например, он может создавать объекты в других доменах приложений или на другом сервере с помощью Remoting.
Ответ 3
Вы можете предоставить Activator.CreateInstance с именем типа и именем сборки вместо объекта Type. Это означает, что он попытается загрузить сборку в текущий AppDomain (если не загружен в настоящее время), а затем попытаться загрузить этот тип. Я считаю, что Assembly.CreateInstance(который вызывает активатор) не пытается загрузить сборку, если она не загружена. Он просто пытается получить объект Type для указанного типа и возвращает null, если он не найден (я говорю это, читая код, а не после тестирования).