AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Verfügbarkeit einer Routine für P/Invoke testen

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

Ein Thema von Apollonius · begonnen am 26. Mai 2009 · letzter Beitrag vom 28. Mai 2009
Antwort Antwort
Seite 1 von 2  1 2   
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, 14: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
Apollonius

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

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

  Alt 27. Mai 2009, 16:57
Ich weiß doch, dass es hier im Forum einige .NET-ler gibt. Fehlen euch irgendwelche Informationen? Irgendjemand muss sich mit diesem Problem doch bereits befasst haben.
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
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 27. Mai 2009, 17:42
Hallo,

probier mal LoadPackage oder LoadAssembly.


Heiko
Heiko
  Mit Zitat antworten Zitat
Apollonius

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

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

  Alt 27. Mai 2009, 20:28
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.
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
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 28. Mai 2009, 07:06
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
Heiko
  Mit Zitat antworten Zitat
Apollonius

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

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

  Alt 28. Mai 2009, 16:13
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).
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
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 28. Mai 2009, 16:30
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
Heiko
  Mit Zitat antworten Zitat
Apollonius

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

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

  Alt 28. Mai 2009, 16:38
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.
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
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#9

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

  Alt 28. Mai 2009, 16:52
Wenn Du Cross Plattform sein willst, kann ich davon ausgehen Du magst Mono benutzen?
Fridolin Walther
  Mit Zitat antworten Zitat
Apollonius

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

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

  Alt 28. Mai 2009, 16:59
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.
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
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:49 Uhr.
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