Как загрузить Assembly во время выполнения и создать экземпляр класса?

StackOverflow https://stackoverflow.com/questions/1803540

Вопрос

У меня есть сборка. В этой сборке у меня есть класс и интерфейс. Мне нужно загрузить эту сборку во время выполнения и хочу создать объект класса, а также использовать интерфейс.

Assembly MyDALL = Assembly.Load("DALL"); // DALL is name of my dll
Type MyLoadClass = MyDALL.GetType("DALL.LoadClass"); // LoadClass is my class
object obj = Activator.CreateInstance(MyLoadClass);

Это мой код. Как это можно улучшить?

Это было полезно?

Решение

Если ваша сборка находится в GAC или bin, используйте имя сборки в конце имени типа вместо Assembly.Load () .

object obj = Activator.CreateInstance(Type.GetType("DALL.LoadClass, DALL", true));

Другие советы

Вы должны использовать динамический метод с для улучшения. это быстрее, чем отражение ..

Вот пример кода для создания объекта с использованием динамического метода.

public class ObjectCreateMethod
{
    delegate object MethodInvoker();
    MethodInvoker methodHandler = null;

    public ObjectCreateMethod(Type type)
    {
        CreateMethod(type.GetConstructor(Type.EmptyTypes));
    }

    public ObjectCreateMethod(ConstructorInfo target)
    {
        CreateMethod(target);
    }

    void CreateMethod(ConstructorInfo target)
    {
        DynamicMethod dynamic = new DynamicMethod(string.Empty,
                    typeof(object),
                    new Type[0],
                    target.DeclaringType);
        ILGenerator il = dynamic.GetILGenerator();
        il.DeclareLocal(target.DeclaringType);
        il.Emit(OpCodes.Newobj, target);
        il.Emit(OpCodes.Stloc_0);
        il.Emit(OpCodes.Ldloc_0);
        il.Emit(OpCodes.Ret);

        methodHandler = (MethodInvoker)dynamic.CreateDelegate(typeof(MethodInvoker));
    }

    public object CreateInstance()
    {
        return methodHandler();
    }
}

//Use Above class for Object Creation.
ObjectCreateMethod inv = new ObjectCreateMethod(type); //Specify Type
Object obj= inv.CreateInstance();

Этот метод занимает только 1/10 времени, необходимого Активатору.

Ознакомьтесь с http://www.ozcandegirmenci.com/ пост / 2008/02 / Create-объектные экземпляры, быстрее, чем Reflection.aspx

Ознакомьтесь с http://www.youtube.com/watch?v=x- KK7bmo1AM Чтобы изменить его код для загрузки нескольких сборок, используйте

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string assemblyName = args.Name.Split(',').First();
            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("YourNamespace." + assemblyName + ".dll"))
            {
                byte[] assemblyData = new byte[stream.Length];
                stream.Read(assemblyData, 0, assemblyData.Length);
                return Assembly.Load(assemblyData);
            }
        }
В ваш основной метод положи
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
Обязательно добавьте свои сборки в свой проект и измените свойство действия сборки на «Встроенный ресурс».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top