Avatar billede knaldeglad Nybegynder
20. maj 2006 - 13:52 Der er 11 kommentarer

kan man nøjes med at loade dll af bestemt type

Hej

Kan man gøre  noget for kun at loade dll af bestemt type...  det er fordi jeg  loader UserControls, men har også et par andre dll filer som den også forsøger at loade,  kan jeg ikke tjecke typen inden den loader eller noget i den stil

kode som den er nu:

someUserControls[h] = new UserControl();
try
{
someUserControls[h] = (UserControl) Activator.CreateInstance(type);
pluginComboBox.Items.Add(someUserControls[h]);
}

jeg får cast exception når den dumper en forkert dll ind....   
på forhånd tak..
Avatar billede knaldeglad Nybegynder
20. maj 2006 - 14:01 #1
hov.. i får lige det hele..

private UserControl[] loadPlugins()
{
    string currentDirectory = System.IO.Directory.GetCurrentDirectory();
    string [] dllFilenames = System.IO.Directory.GetFiles(currentDirectory, "*.dll");

    //opretter array af plugins med pladser svarende til antal dllér loadet
    someUserControls = new UserControl[dllFilenames.Length];

    Console.WriteLine(someUserControls.Length+" pladser bled oprettet til dller");
    int h = 0;
    foreach(string filename in dllFilenames)
    {
        Console.WriteLine("hej " + filename);
        try
        {
                   
            //dette skal erstattes af noget langt smartere
            if (!filename.Equals("C:\\Documents and settings\\JK\\Skrivebord\\Software\\Software\\AMHA\\bin\\Debug\\AMHAPluginInterface.dll"))
            {
                Assembly asm = Assembly.LoadFrom(filename);
                Type [] typesInAssembly = asm.GetTypes();
                foreach(Type type in typesInAssembly)
                {     
       
                    //opretter fra mange dllér.
                    someUserControls[h] = new UserControl();
                    try
                    {
                        Console.WriteLine(type.ge);
                        someUserControls[h] = (UserControl)Activator.CreateInstance (type);
                        pluginComboBox.Items.Add(someUserControls[h]);
                    }
                    catch(System.MemberAccessException mae)
                    {
                        Console.WriteLine(mae);
                    }
                    h++;
                }
            }
        }
        catch(BadImageFormatException e)
        {
            // Not a valid assembly, move on
        }
        finally
        {

        }
    }
    return someUserControls;
}
Avatar billede arne_v Ekspert
20. maj 2006 - 23:35 #2
positiv liste
negativ liste
regex pattern match
Avatar billede arne_v Ekspert
18. juni 2006 - 20:54 #3
kommet videre ?
Avatar billede knaldeglad Nybegynder
20. juni 2006 - 10:16 #4
Jaee  vælger dllér på deres navn...  dete r noget klyt....    ku ik finde ud af det der regex patern match...  evt vil du præcisere ..  evt lille stump kode..
Avatar billede knaldeglad Nybegynder
20. juni 2006 - 10:17 #5
sage er med positiv liste, så falder det hele lidt til jorden....  med at kunne smide plugins til dynamisk loadning i dette system.. men evt noget med negatv liste... men den er heller ikke sikker...
Avatar billede arne_v Ekspert
21. juni 2006 - 04:11 #6
måske noget med:

Regex.IsMatch(dllname, "^prefix_[a-z0-9]+.dll$")
Avatar billede nielle Nybegynder
21. juni 2006 - 07:02 #7
Den helt simple måde ville være at udnævne et bestemt bibliotek til plugin-bibliotek. Og så ikke smide andet en plugins ind der.
Avatar billede knaldeglad Nybegynder
21. juni 2006 - 09:53 #8
det med anden mappe kan jeg ikke få til at virke for der er flere klasser i hvert plugin og de bliver også opfattet som dller ?!  mht arne,  jooee  der da fint... men det er jo også kun på navnet... ik ?  men har tænkt på noget helt andet.  evt noget med at se efter en bestemt funktion i dll for jeg bruger et interface som hvert plugin skal overholde....  og så kun loade de dll der har netop den funktion fra mit interface....
Avatar billede nielle Nybegynder
21. juni 2006 - 18:24 #9
Hvis dine DLL'er på samme tid kan indeholde klasser som er, og klasser som ikke er plugins, så nytter det ikke noget f.eks. at filtrere på DLL'ernes navne.

I stedet bliver du så nødt til at loade hver DLL og tjekke hver klasse for om den er en plugin eller ej.

En måde at gøre dette på er at indføre et interface; Hvis en given klasse implementere dette interface så er den et plugin. Ved at definere forskellige interfaces kan man så samtidig arbejde med forskellige typer af plugins til samme program.

Normalt placeres dette interface i sin egen DLL:

    public interface DitPluginInterface
    {
        int EnMetode(int etTal);
    }

De DLL'er som er beregnet på at implementere plugins skal have en reference til denne interface-DLL, og deres kode kan så typisk se sådan ud:

    public class EtPlugin: DitPluginInterface
    {
        public int EnMetode(int etTal)
        {
            return etTal + 710640;
        }
    }

    public class IkkeEtPlugin
    {
        public int EnMetode(int etTal)
        {
            return etTal + 42;
        }
    }

Ved at kræve, at dine plugins implementere DitPluginInterface, sikre du dig samtidigt at et plugin altid har implementeret alle de rigtige metoder og felter.

I det program, som skal bruge plugins, starter du med at loade alle DLL'erne fra der hvor de nu er specificeret til at skulle ligge. Derefter tjekker du indholdet for klasser som implementer DitPluginInterface interfacet. Det kunne se sådan ud:

    namespace e710640
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<Type> plugins = new List<Type>();

                DirectoryInfo pluginDirectory = new DirectoryInfo(@"C:\Source.Net20\e710640plugin\bin\Debug");

                foreach (FileInfo fi in pluginDirectory.GetFiles("*.dll"))
                {
                    Assembly muligtPlugin = Assembly.LoadFrom(fi.FullName);

                    foreach (Type type in muligtPlugin.GetTypes())
                    {
                        Type plugInteface = type.GetInterface("DitPluginInterface");
                        if (plugInteface != null) plugins.Add(type);
                    }
                }

                foreach (Type plugin in plugins)
                    Console.WriteLine(plugin.ToString());
            }
        }
    }
Avatar billede nielle Nybegynder
08. juli 2006 - 07:55 #10
Har du fået kigget på det?
Avatar billede knaldeglad Nybegynder
04. februar 2013 - 10:39 #11
OK sry, der er nok ikke nogen der ser på dette mere..  vil nogen svare?, kan end ikke huske hvordan jeg løste det.
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