Einzelnen Beitrag anzeigen

Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#1

Verfügbarkeit einer Routine für P/Invoke testen

  Alt 26. Mai 2009, 15:11
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
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat