كيفية تحميل الجمعية في وقت التشغيل وإنشاء مثيل فئة؟

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 أو بن استخدام اسم التجميع في نهاية اسم النوع بدلا من 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 / الوقت 10TH التي يحتاجها المنشط.

http://www.ozcandegirmenci.com/ آخر / 2008/02 / إنشاء وجوه الحالات، أسرع مما كان 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