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