Toon posts:

[C#] DLL dynamisch laden

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor een project ben ik bezig met het bouwen van een applicatie in C#.net
Het moet een applicatie worden die PDF bestanden uitpoept aan de hand van data die de applicatie uit een database leest. De layout van de PDF bestanden is telkens verschillend. In de data uit de database staat ergens een veld zodat ik weet welke layout het moet worden. In de toekomst krijgen we steeds meer verschillende layouts. Mijn idee is dan om dan gewoon een nieuwe dll te schrijven en die bij de applicatie te plaatsen. Nu is mijn idee om 1 applicatie te schrijven die de data oppakt de PDF aanmaakt en dan bijvoorbeeld 1 functie aanroept uit een DLL, deze DLL hangt af van welke layout ik moet gebruiken. Ik weet dus bij het bouwen van de applicatie niet hoe de DLL gaat heten, dat staat namelijk in de data! Wel weet ik dat die dll 1 functie bevat genaamd SchrijfPagina(string data)


Dus:
-Hoofdprogramma
-dll1
-dll2
-dll3
-dlln

Hoe kan ik vanuit het hoofdprogramma een bepaalde DLL laden en daaruit een functie aanroepen die mij bekend is.

Op internet kon ik wel een aantal zaken vinden over .NET en dll's maar niet hoe ik een DLL kan laden als ik de naam ervan (nog) niet weet.

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Waarom zou je al die functies in een andere DLL gaan zetten?
Je kan alles in 1 dll zetten , en dan die DLL gaan updaten/patchen ofzo.


Misschien kan je eens kijken naar het strategy design pattern en het abstract factory design pattern.

[ Voor 19% gewijzigd door whoami op 05-06-2003 15:03 ]

https://fgheysels.github.io/


  • Zoppie
  • Registratie: December 2000
  • Niet online
Ik heb geen antwoord voor je, maar als het je niet lukt kun je ook eens kijken naar xsl-fo.
Hiermee kun je dmv een stylesheet en xml pdf documenten genereren. Je maakt dan voor elke nieuwe opmaak een ander stylesheet. Dit heeft als voordeel dat je niet bij elke nieuwe opmaak een dll moet maken.

Verwijderd

Hier een stukje wat ik in een project heb gebruikt:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public void LoadCommandPlugin(FileInfo file)
{
    if ( file.Exists )
    {
        Assembly plugin = Assembly.LoadFrom(file.FullName);
        Type[] types = plugin.GetExportedTypes();

        foreach (Type type in types)
        {
            object[] atts = type.GetCustomAttributes(typeof(FTPCommandAttribute), false);
            if ( atts.Length == 1)
            {
                FTPCommandAttribute fca = (FTPCommandAttribute) atts[0];
                
                // check if a base type of FTPCommand
                if ( type.IsSubclassOf(typeof(FTPCommand)) )
                {
                    Type[] ctoTypes = { typeof(FTPRequest) };
                    ConstructorInfo ci = type.GetConstructor(ctoTypes);
                    if ( ci != null )
                    {
                        commands.Add(fca.Command.ToUpper(), type);
                    }
                }
            }
        }
    }
}

Hier wordt een assembly ingeladen en alle types worden geinspecteerd op een bepaald custom attribuut.
Elke klasse binnen de DLL die dat attribuut heeft wordt dan vervolgens geinstantieerd door de constructor van het type op te vragen, en uit te voeren. De te gebruiken DLL's heb ik gedefinieerd in de .config file van het project.
Je kunt op deze manier mooi flexibele systemen opzetten.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
houd er wel rekening mee dat wanneer je een dll laadt in je eigen appdomain, je deze dll nooit meer kunt unloaden uit het appdomain.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com