Наиболее простой способ создать объект, который становится известным только на эпапе выполнения, это
Type.GetType(). К сожалению, этот путь и самый неэффективный : Type.GetType() не только пытается загрузить указанный
assembly, но запрашивает полный достун к его
metadata для того, чтобы возвращаемый результат был, как и специфицировано, типа System.Type.
С другой стороны, Activator.CreateInstance() возвращает
object handler без попытки доступа к metadata. Этот путь в несколько раз быстрее, но и, как следовало ожидать, нельзя пожертвовать metadata без каких-либо потерь : возврашаемый Activator.CreateInstance() ObjectHandle можно использовать разве что для немедленной передачи в другой domain, и, видимо, в этом и состоит предназначение этото метода, потому что никакой функциональной нагрузки этот ObjectHandle без соответствующей
metadata не несет. Или сразу же после передачи в другой domain, или в непосредственно в вызывающем, первое, что делают с таким ObjectHandle - вызывают его Unwrap(), кот. собственно и загружает недостающую metadata для объекта.
Отметим, что без Unwrap() никакие операции с возвращенным объектом не имеют смысла : так, например, даже если он является реализацией интерфейса, то поскольку это становится известным CLR только с помощью
metadata, cast на родительский интерфейс без Unwrap() не будет успешным.