كيفية تحميل الجمعية في وقت التشغيل وإنشاء مثيل فئة؟
-
05-07-2019 - |
سؤال
ولدي التجمع. في هذه الجمعية لدي فئة واجهة. ولست بحاجة لتحميل هذه الجمعية في وقت التشغيل وتريد إنشاء كائن من الفئة وتحتاج أيضا إلى استخدام واجهة.
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;
تأكد من إضافة المجالس لمشروعك وتغيير الخاصية العمل بناء على "الموارد المضمنة".
لا تنتمي إلى StackOverflow