Avatar billede bildsoe Nybegynder
06. januar 2011 - 15:09 Der 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);
            }

            Console.ReadKey();

        }
    }
}
Avatar billede mcb2001 Nybegynder
06. januar 2011 - 15:18 #1
må man spørge hvad årsagen til at det skal loades dynamisk er?

De fleste opgaver kan løses ved at loade dller i build, og så bruge dem herfra.
Avatar billede bildsoe Nybegynder
06. januar 2011 - 15:24 #2
Jeg vil kunne udvide mit program senere. Uden at skulle ændre i selve core-delen, men blot ved at tilføje udvidelsesfiler til en mappe.
Avatar billede mcb2001 Nybegynder
06. januar 2011 - 15:40 #3
ja okay :-)

Jeg har ingen erfaring med at loade dll'er i C# - har leget med det tilsvarende i Java, hvor man loader class filer.

Men jeg vil da gerne se om der er andre der har idéer, så bliver lige hængende på tråden her :-)
Avatar billede bildsoe Nybegynder
06. januar 2011 - 15:47 #4
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.

Men lyder godt, hvis du gider kigge på det.
Avatar billede bildsoe Nybegynder
06. januar 2011 - 15:48 #5
Ups det før skulle have været en kommentar... ignorér venligst at det er et svar :)
Avatar billede arne_v Ekspert
06. januar 2011 - 15:48 #6
Koden virker fint hos mig.

????

panel2.component01
System.String getMyName()
System.String ToString()
Boolean Equals(System.Object)
Int32 GetHashCode()
System.Type GetType()
Void .ctor()
Avatar billede bitmatic Nybegynder
06. januar 2011 - 15:50 #7
Prøv evt. at kigge på Managed Extensibility Framework.
Avatar billede arne_v Ekspert
06. januar 2011 - 16:12 #8
Der er mange muligheder:

simpel/faa features----------------------->komplekst/mange features

Assembly.Load---------->MEF--------------->MAF
Avatar billede bildsoe Nybegynder
07. januar 2011 - 10:35 #9
Hej arne_v

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?
Avatar billede arne_v Ekspert
07. januar 2011 - 15:47 #10
Compileren og library kommer med .NET Framework ikke med Visual Studio, saa udgaven af Visual Studio burde ikke betyde noget.

Det eneste som kan drille er placeringen af filerne.
Avatar billede bildsoe Nybegynder
07. januar 2011 - 19:40 #11
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.
Avatar billede arne_v Ekspert
07. januar 2011 - 23:38 #12
Har du prøvet at kopiere EXE og DLL til et dir og køre EXE i kommandoprompt?

Og verificeret med ILDASM at DLL indeholder det som den skal?
Avatar billede bildsoe Nybegynder
10. januar 2011 - 09:31 #13
Hej

Har prøvet det hele og ILDASM viser at den indeholder det den skal. Har kopieret exe og dll ud i roden og ændret:

Assembly asm = Assembly.Load("components");

til:

Assembly asm = Assembly.Load("c:\\components.dll");

Men nu crasher den bare og siger at den ikke kan finde filen.

Synes godt nok det hele er lidt underligt.
Avatar billede mcb2001 Nybegynder
10. januar 2011 - 11:32 #14
Hvis det er vista har du ikke adgang til c's rod
Avatar billede bildsoe Nybegynder
10. januar 2011 - 12:05 #15
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.

Ved ikke hvem der skal have point?
Avatar billede bvli Praktikant
10. januar 2011 - 12:45 #16
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[]))
Avatar billede bildsoe Nybegynder
11. januar 2011 - 14:29 #17
Arne_v vil du lave et svar så du kan få point?
Avatar billede arne_v Ekspert
11. januar 2011 - 15:10 #18
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester