06. januar 2011 - 15:09Der er
17 kommentarer og 1 løsning
Hvordan loader man dynamisk en dll
Hej
jeg har fundet masser af tutorials, men ingen af dem fungerer for mig - så jeg gør jo nok noget forkert... Jeg har lavet et test forsøg, hvor jeg har en compilet dll der hedder components.dll.
I dette library, har jeg bare 1 klasse, med 1 metode udover de inbyggede. Men kun de indbyggede vises når jeg prøver at loade dette library fra en anden fil. Jeg vil også gerne kunne se de metoder jeg selv har skrevet. Nogen der ved hvordan jeg gør det her?
//components.dll
namespace panel2 { public class component01 {
string myName = "component01";
public string getMyName() { return myName; }
}
}
//PROGRAMMET der prøver at hente metoderne fra components.dll namespace panel2 { class Program {
public static void Main(string[] args) { string targstr = (args.Length == 0 ? null : args[0].ToLower()); Assembly asm = Assembly.Load("components"); Type[] typelist = asm.GetTypes(); foreach (Type type in typelist) { string typestr = type.ToString().ToLower(); if (targstr != null && targstr != typestr) continue; Console.WriteLine(type); MemberInfo[] memlist = type.GetMembers(); foreach (MemberInfo mem in memlist) Console.WriteLine(" " + mem); }
Ja, det er jo egentligt også bare et class-library jeg prøver at loade. Altså jeg har oprettet projektet i VSE2008 som et class-library og build'et det. Har fundet virkeligt mange eksempler, men der er ikke nogen af dem der fungerer. Når jeg prøver dem på koden ovenfor så finder den ikke getMyName mathod'en.
Jeg kigger på disse frameworks, men det undrer mig stadig, at koden foroven giver dig det rigtige resultat. Kan det være fordi jeg bruger Visual Studio Express at jeg har problemer med det?
Nej, det tænkte jeg nok. Hmmm, det der er rigtig underligt er at når jeg kører den kan den genkende class'en som panel2.components men metoden mangler bare i listen. Der er kun dem den arver efter object.
Det er windows 7 - men kommer lige til at tænke på, at det stadig godt kunne være et problem. Og ja, efter at have tjekket det hele igennem og sat den der sikkerheds-slider helt i bund fungerer det faktisk. Så tak for hjælpen.
Assembly.Load(string) skal angive assembly name - ikke filnavn. (som minimum skal du altså angive navnet på assembly'et som (som regel) er filnavnet uden extension.
Du kan i et appdomain ikke loade filer ind som ikke ligger i dit appdomains basedir eller et underdirectory hertil. (Du kan komme omkring dette hvis du selv åbner din assembly-fil og så bruger Assembly.Load(byte[]))
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.