Naložit dll in run time

Rabil bi naložit en dll v runtime-u in iz njega dobit ven en statičen objekt in nekaj constant v tem objektu. Nekaj sem se pomagol z googlom in pršu samo do tega da obstaja nekaj takega:
Assembly sampleAsm = Assembly.LoadFrom(@"D:\Clear Case Convertor\Trials\TfsTesterApp\MyClassLibrary\bin\Debug\MyClassLibrary.dll");

Povezava 

Mi lahko kdo pove kako doseči zgoraj napisano. Tisti razred in constante znotraj razreda.

Avtor: fora, objavljeno na portalu SloDug.si (Arhiv)

Leave a comment

Please note that we won't show your email to others, or use it for sending unwanted emails. We will only use it to render your Gravatar image and to validate you as a real person.

bojanv
bojanv - četrtek, 12. april 2007

Res je. Rabiš tip. Tega dobiš tko, da preko Assembly-a dobiš tip.Assembly ass = Assembly.LoadFrom("pot");object instance = ass.CreateInstance("parametri"); //kot si napisal zgoraj, ne da se mi prepisovatType t = ass.GetType("MojRazred");Preden dobiš tip, moraš ustvarit instanco razreda. Ker drugače late binding ne bo deloval oziroma boš dobil lepo napakico. Ko imaš tip, poveš, da rabiš Field, torej uporabiš razred FieldInfo. Lahko dobiš tudi vse tipe, ki se nahajajo v assembly-u pa nardiš foreach čez te tipe ( ass.GetTypes ).FieldInfo f = t.GetField("imeFielda",BindingFlags.Public | BindingFlags.Static); //še so drugi, ki jih lahko pregledašPoveš, kateri field in kakšen je ta field. Lahko uporabiš tudi metodo GetFields, kjer dobiš array objektov FieldInfo.Zdaj pa pokličeš vrednost, torej f.GetValue(imeObjekta); torejint value = (int)f.GetValue(t); //ker vrne metoda object, potrebuješ cast v tip, ki ti predstavlja field.Torej, vrednost maš, kaj boš pa z njo delal, je pa tvoja stvar....

fora
fora - četrtek, 12. april 2007

Najlepša hvala za resnično dober odgovor. Sicer ne rabim nobenih metod, samo public premenljivke, vendar sem po mojem prišel do rešitve, nisem pa še nič testirol.Assembly ass = Assembly.LoadFrom("test.dll");Object o = ass.CreateInstance("MyObject", false, BindingFlags.ExactBinding, null, new Object[]{2}, null null);Samo to še vedno ni to. Še vedno ne vem kako dostopat do public spremenljivk tega objekta. Ta objekt je object torej nič ne ve o mojih spremenljivkah tega razreda.Se motim?

bojanv
bojanv - sreda, 11. april 2007

Lahko se sprehodiš čez vse tipe...recimo takole:Assembly a = Assembly.LoadFrom("assembly.dll");foreach(Type t in a.GetTypes()){if (t.IsSubclassOf(typeof(ImeClassa)){object o = Activator.CreateInstance(t);MethodInfo mi = t.GetMethod("imemetode");mi.Invoke(o, null);}}Lahko pa to nardiš malce drugače...object o = Activator.CreateInstance("assembly.dll","ImeClassa");Type t = o.GetType();t.GetMethod("ime").Invoke(o, null); Če pa hočeš ustvariti prav tip ob runtime-u, si pa pomagaj z AssemblyBuilderjem. Rabil še boš kasneje ModuleBuilder in pa TypeBuilder.Je pa res, da ma MethodInfo še polno drugih metod, ki so zelo koristne...Recimo z Assemblybuilderjem lahko narediš knjižnico in jo shraniš na disk. Pa taka čudesa....Za Activator pravijo, da je počasen, samo ne opaziš neke hude razlike. Je pa res, da sem se samo enkrat (davno nazaj) s tem poigral Activator pa najdeš tule, eden koristnih blogov o tem pa tule, kjer tudi primerja in pove, kaj točno je treba narest, da celoten razred spraviš v življenje.