Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Verfügbarkeit einer Routine für P/Invoke testen (https://www.delphipraxis.net/134655-verfuegbarkeit-einer-routine-fuer-p-invoke-testen.html)

Apollonius 26. Mai 2009 14:11


Verfügbarkeit einer Routine für P/Invoke testen
 
Hallo .NET-Gemeinde,
ich arbeite momentan an einem C#-Projekt, welches eine Art native Plugins - auf einzelnen Routinen basiert - unterstützen soll. Diese kann ich mit System.Reflection.Emit und P/Invoke aufrufen. Beim Import habe ich eine Liste von Bibliotheken und den Namen sowie die Signatur der zu importierenden Routine. Das Problem ist aber, dass ich nicht weiß, in welcher Bibliothek die Routine residiert. Daher möchte die Bibliotheken durchgehen und überprüfen, ob eine Routine mit dem bekannten Namen exportiert wird. Der Plugin-Mechanismus ist fest; die Information, in welcher Bibliothek die Routine sitzt, muss ich also selbst ermitteln. Dabei will ich unbedingt plattformunabhängig arbeiten, möchte also nicht LoadLibrary und GetProcAddress importieren.
Momentan ist meine Idee, mit System.Reflection.Emit eine entsprechende P/Invoke-Methode zu erstellen und dann Marshal.Prelink darauf aufzurufen; erhalte ich eine Exception, weiß ich, dass die Routine in der Bibliothek nicht vorhanden ist (andere Fehler schließe ich einfach mal aus). Offensichtlich ist diese Technik äußerst unelegant und ineffizient, da ich zum Testen ziemlich viele Methoden erstellen muss. Um eine hohe Speicherbelastung zu vermeiden, lagere ich den Test in eine AppDomain aus, die ich nach ca. 1000 Testimports mitsamt der dynamischen Assembly receyclen kann. Die Notwendigkeit einer zusätzlichen AppDomain macht das Ganze dann auch noch ziemlich langsam.
Meine Frage ist also, ob es eine nicht-native Möglichkeit gibt, zu ermitteln, ob eine Routine in einer nativen Bibliothek existiert - oder gleichbedeutend, ob ein P/Invoke auf die entsprechende Routine in der Bibliothek erfolgreich sein wird.
Vielen Dank im Voraus
Apollonius

Apollonius 27. Mai 2009 16:57

Re: Verfügbarkeit einer Routine für P/Invoke testen
 
Ich weiß doch, dass es hier im Forum einige .NET-ler gibt. :mrgreen: Fehlen euch irgendwelche Informationen? Irgendjemand muss sich mit diesem Problem doch bereits befasst haben.

hoika 27. Mai 2009 17:42

Re: Verfügbarkeit einer Routine für P/Invoke testen
 
Hallo,

probier mal LoadPackage oder LoadAssembly.


Heiko

Apollonius 27. Mai 2009 20:28

Re: Verfügbarkeit einer Routine für P/Invoke testen
 
Danke für die Antwort.
Ich kann dir allerdings nicht ganz folgen: Was sind das für Routinen und wo sind sie definiert? Außerdem hören sich weder LoadAssembly noch LoadPackage nach nativer Bibliothek an.

hoika 28. Mai 2009 07:06

Re: Verfügbarkeit einer Routine für P/Invoke testen
 
Hallo,

google mal nach "LoadLibrary Mono".

Mit fällt gerade auf, das ein Package ja was mit .Net zu tun hat ...
also gar nix "native" ist.


Heiko

Apollonius 28. Mai 2009 16:13

Re: Verfügbarkeit einer Routine für P/Invoke testen
 
Hallo,
irgendwie habe ich das Gefühl, dass du mein Problem nicht verstanden hast. Ich suche eine Methode aus der .NET-Klassenbibliothek, die den selben Mechanismus wie P/Invoke per DllImport nutzt, aber das ganze irgendwie dynamisch macht, sodass ich das leichter auf meine Plugins anwenden kann - dynamisches P/Invoke funktioniert ja normalerweise nur mit System.Reflection.Emit, und dort kann ich eben Fehler nicht in vernünftiger Weise abfangen. Es würde natürlich auch funktionieren, wenn ich vorher sicherstellen kann, dass P/Invoke keinen Fehler schmeißt (worauf ich in meinem Ausgangspost eher hinauswollte).

hoika 28. Mai 2009 16:30

Re: Verfügbarkeit einer Routine für P/Invoke testen
 
Hallo,

ich hatte bei den Mono-Sachen irgendwas was gelesen,
was das DllImport (bei Mono heisst das irgendwie etwas anders) ersetzt.

Aber mit so einem Kram habe ich mich noch nicht beschäftigt.

Vielleicht ist das hier ja was.
Dynamic PInvoke



Heiko

Apollonius 28. Mai 2009 16:38

Re: Verfügbarkeit einer Routine für P/Invoke testen
 
Auf der verlinkten Seite ist nur dargestellt, wie man durch Importieren von LoadLibrary und GetProcAddress auf native Routinen Zugriff erlangen kann. Damit bin ich aber nicht plattformunabhängig.

Fridolin Walther 28. Mai 2009 16:52

Re: Verfügbarkeit einer Routine für P/Invoke testen
 
Wenn Du Cross Plattform sein willst, kann ich davon ausgehen Du magst Mono benutzen?

Apollonius 28. Mai 2009 16:59

Re: Verfügbarkeit einer Routine für P/Invoke testen
 
Momentan schon, da Mono einfach die am weitesten entwickelte nicht-Windows-CLR ist. Prinzipiell soll das Ganze dann aber mit allen Runtimes laufen, die sich an die CLI-Spezifikation halten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:59 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz