Avatar billede sw_red_6 Nybegynder
25. oktober 2004 - 11:22 Der er 18 kommentarer og
1 løsning

Runtime init af funktioner i en DLL fil

Kan man skrive en C# applikation der kan bruge forskellige DLL'er alt efter hvilken fil der vælges i en FileOpenDialog (eller hvad den hedder)
Er det muligt at man kan vente med at hente funktionerne ind og "initialisere" dem til filen er blevet valgt?
Jeg ved at man kan bruge DLLImport til at hente funktioner fra en dll men der skal man kende funktionsnavnet og navnet + stien til dll'en.
Avatar billede sovsekoder Nybegynder
25. oktober 2004 - 11:24 #1
det kan man godt ved brug af reflection
Avatar billede sw_red_6 Nybegynder
25. oktober 2004 - 11:27 #2
kan du give et simpelt eksempel?
Avatar billede sovsekoder Nybegynder
25. oktober 2004 - 11:27 #3
* med System.Reflection.Assembly.LoadFrom(addInModulePath), kan du hente en assembly fil

* med Type [] typesInAssembly = assembly.GetTypes(); kan du hente alle types i assembliet

* med Activator.CreateInstance(type); kan du lave en instans af en type
Avatar billede sovsekoder Nybegynder
25. oktober 2004 - 11:31 #4
ok et eksempel, hmmm : lad os sige du har i sinde at oprette en bestemt type fra en vilkårlig .NET assembly fil (.dll). Vi kalder typen for AddinClass:

string addInModulePath = "c:\\hererderendll.dll";
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(addInModulePath);
Type [] typesInAssembly = assembly.GetTypes();
AddinClass addin = null;
foreach(Type type in typesInAssembly)
{       
  if(null != type.XXXXXXXXX(typeof(AddinClass).FullName))
  {
    addIn = (AddinClass)Activator.CreateInstance(type);
  }
}

if(addIn != null)
{
  // Her hvis det gik godt!!
}
Avatar billede sovsekoder Nybegynder
25. oktober 2004 - 11:35 #5
ok det passer ikke det jeg har skrevet... det er totalt volapuk, det må du undskylde. Jeg kan komme med et link nu, og en bedre forklaring lidt senere (fik lige travlt)
Avatar billede sovsekoder Nybegynder
25. oktober 2004 - 11:36 #6
denne tutorial er faktisk god:
http://www.thecodeproject.com/csharp/reflection.asp

prøv den!
Avatar billede sovsekoder Nybegynder
25. oktober 2004 - 11:39 #7
den grundlæggende ide i hans tutorial er at man implementerer et interfafce i sin assembly. Når man så skal loade en assembly tjekker man, hvilke interfaces der er implementeret i assemblien. Hvis der er nogen, opretter man en instans af interfacet og kan så gå igang med at brugge klassen fra assembly'en
Avatar billede sovsekoder Nybegynder
25. oktober 2004 - 12:03 #8
Det eksempel jeg kan anbefale er koden fra tutorial'en på code project. Hvis du har spørgsmål til det så fyr løs.

Det er en go' ide at få afklaret de grundlæggende spørgsmål:

Det første spørgsmål er nok hvad man vil bruge "funktionaliteten til". Vil man hente en ekstern fil ind for at få den til at udføre et job for "hoved applikationen" (så er eksemplet godt). Eller vil man bare starte en ekstern fil, og lade den køre selvstændigt (så kan man bare starte filen med process.Start).
Avatar billede sw_red_6 Nybegynder
25. oktober 2004 - 12:11 #9
Tak, jeg vil kigge nærmere på det når jeg får lidt mere tid. Evt. først i weekenden så der går lidt tid inden du kan få dine point, hvis det er hvad jeg skal bruge.
Avatar billede arne_v Ekspert
25. oktober 2004 - 20:12 #10
Er det en .NET assembly DLL eller en Win32 DLL ?
Avatar billede sw_red_6 Nybegynder
26. oktober 2004 - 08:55 #11
det er unmanaged C++ som skal bruges til et måleapparat. Programmet skal testes på PC vha et interface (ikke interface som "klassen") lavet i C#. Dette test program skal kunne brug tilpasses til alle de forskellige programmer fra måleapparaterne og skal kunne tilpasses til alle kommende programmer. Derfor er det lidt besværligt at skulle skrive koden så den passer til dll'en med f.eks. en alm. DLLImport
Avatar billede sovsekoder Nybegynder
26. oktober 2004 - 09:53 #12
så kan du desværre godt glemme alt om hvad jeg har skrevet..
Avatar billede sw_red_6 Nybegynder
26. oktober 2004 - 10:13 #13
hmmm, er der så en anden måde at gøre det på?
Avatar billede sw_red_6 Nybegynder
26. oktober 2004 - 14:54 #14
Er det nemmere at bruge VC++ .NET end C# til det?
Avatar billede arne_v Ekspert
26. oktober 2004 - 14:56 #15
unmanged C++ er nemmere

managed C++ og C# må være det samme

jeg vil godt prøve at lede efter en løsning til C# senere
Avatar billede arne_v Ekspert
26. oktober 2004 - 20:45 #16
Jeg kan ikke finde noget.

Så derfor kan jeg kun se en mulighed:

C#----(DLLImport)---->myloader.dll----(LoadLibrary+GetProcAddress)---->xxxx.dll + yyyy.dll + zzzz.dll
Avatar billede sw_red_6 Nybegynder
27. oktober 2004 - 09:15 #17
ahh du mener altså at man skal lave en DLL (myloader) i unmanaged C++ som kan hente de forskellige funktioner i de andte DLL'er og så kalde den DLL i C#.
Hm det kan være at det må blive sådan det gøres.
Så må jeg jo bare i gang med at studere C++ bogen jeg har for at se om der står noget brugbart. Ellers kommer jeg frygtligt tilbage ;-)
Jeg har dog læst et eller andet sted at i framework 2.0 skulle C# understøtte det jeg vil lave, men det er egentlig kun et rygte som jeg ikke har undersøgt nærmere så...
Avatar billede arne_v Ekspert
28. oktober 2004 - 19:48 #18
Ellers kunne jeg da lave lidt kode ...
Avatar billede sw_red_6 Nybegynder
08. november 2004 - 08:50 #19
Hvis det bliver nødvendigt så opretter jeg et nyt spørgsmål
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