Assembly.Load() несколькими методами в одном классе для загрузки одной и той же сборки - оптимально или нет?
У меня есть класс с несколькими методами (например, Method1, Method2, Method3), и внутри каждого метода я загружаю сборку (одинаковую в каждом методе) и вызываю определенный метод (отражение) следующим образом:
void Method1() // error handling etc. omitted
{
Assembly asm = Assembly.LoadFrom(path);
Type type = asm.GetType(classname);
MethodInfo methodInfo = type.GetMethod("MethodName", ...);
var o = Activator.CreateInstance(type);
var result = methodInfo.Invoke(o, parameters);
}
Можно ли с точки зрения производительности делать отражение таким образом, при условии, что все эти методы загружают одну и ту же сборку? Код выглядит следующим образом:
obj.Method1(); // calls Assembly.Load()
obj.Method2(); // calls Assembly.Load()
obj.Method3(); // calls Assembly.Load()
или было бы лучше загрузить сборку (и, возможно, GetType) только один раз в отдельный метод, сохранить ссылку на свойство класса Assembly и внутри методов (Method1, Method2, Method3..) использовать эту ссылку вместо того, чтобы всегда вызывать Assembly.Load()? Таким образом, код будет выглядеть примерно так:
obj.LoadMyAssembly(); // calls Assembly.Load() and uses obj.MyAssembly property to store the reference
obj.Method1() // doesn't call Assembly.Load(), uses obj.MyAssembly instead
obj.Method2() // doesn't call Assembly.Load(), uses obj.MyAssembly instead
obj.Method3() // doesn't call Assembly.Load(), uses obj.MyAssembly instead
Есть ли какая-то разница? Домены и т. Д. Никогда не изменяются (или даже не используются) внутри кода.
2 ответа
Большой разницы нет, поскольку сборка будет загружена в одном контексте. Затем, если сборка уже загружена, она не будет перезагружаться, даже если вы вызываете Assembly.LoadFrom(path);
Однако, если вы уже знаете, что все методы находятся в одной сборке, лучше вызвать Assembly.LoadFrom
только однажды.
Насколько я знаю, загрузка одной и той же сборки более одного раза не вызовет проблем с производительностью. Тем не менее, посмотрите на ваш метод, есть
var o = Activator.CreateInstance(type);
Вы вызываете метод-член для определенно нового экземпляра объекта типа.
Хотя это может не вызывать проблем, а просто избыточное поведение, не так ли? Я думаю, что просто пропадают и увеличивают сбор мусора на куче.