API für eigenes Programm

  • VB.NET

Es gibt 92 Antworten in diesem Thema. Der letzte Beitrag () ist von singu.

    API für eigenes Programm

    Wie der Titel schon sagt, möchte ich eine API für ein eigenes Programm erstellen. Diese soll Events vom Programm bekommen können, aber die API sollte auch Funktionen und Events feuern können, auf die dann das Hauptprogramm reagiert. Nun such ich nach Anleitungen, die beschreiben wie man sowas macht. Mit Google habe ich nichts gefunden, was mir weiterhilft.
    Das Schlüsselelement dafür ist ein öffentliches Interface. In diesem deklarierst du die Member, die du extern verfügbar machen willst, z.B. Function TueEtwas(). Dieses Interface implementierst du selbst in einer Klasse, sodass TueEtwas() eine Bedeutung bekommt. Die Klasse braucht dann noch eine so genannte Fabrikmethode, die dir Instanzen des Interfaces ausspuckt, z.B. Shared Function GetInstance() As IDeinInterface. Ein externer Aufrufer würde sich nun über diese Fabrikmethode eine Referenz auf dein Interface besorgen: Dim var As APIprogramm.IDeinInterface = ...GetInstance(). Mit 'var' ist es dem externen Programm erlaubt, var.TueEtwas() auszuführen. Das Ganze nochmal als Codebeispiel:

    VB.NET-Quellcode

    1. Public Interface IDeinInterface
    2. Function TueEtwas() As Int32
    3. End Interface
    4. Public Class MyAPI
    5. Implements IDeinInterface
    6. Public Shared Function GetInstance() As IDeinInterface
    7. Return New MyAPI
    8. End Function
    9. Private Function TueEtwas() As Int32 Implements IDeinInterface.TueEtwas
    10. Return 5
    11. End Function
    12. End Class

    EDIT: Zugriffsebenen angepasst. Es fällt auf, dass über das Interface von außen auch Private-Funktionen aufgerufen werden können...

    Das gegebene API funktioniert Online und Offline - das heißt, dass die Anwendung nicht gestartet sein muss, um das Interface zu instanzieren. Stattdessen wird der Code in die aufrufende Anwendung geladen. Wenn du ein API erstellen möchtest, welches nur bei einer laufenden Anwendung funktioniert, solltest du dich mit RPC und TCP/IP beschäftigen. Es gibt 1001 Möglichkeiten, ein API zu schreiben - das gezeigte ist eine davon. Such dir also was aus :)
    Gruß
    hal2000

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()

    singu schrieb:

    Das Codebeispiel würde dann ins Hauptprogramm gehören?

    Wenn das API Funktionen ausführen soll, die darin definiert sind, dann ja.
    Was meinst du mit Fabrikmethode?

    Die heißt so, weil sie (wie eine Fabrik) Instanzen der API an externe Aufrufer ausliefert. Damit kannst du z.B. die Anzahl der gleichzeitig aktiven Instanzen kontrollieren.
    Müsste ich dann das ganze in eine DLL packen und diese dann von beiden Seiten verwenden.

    Das geht auch, bedeutet aber mehr Programmieraufwand. Die DLL ist eine eigenständige Assembly, die ihrerseits die Funktionen wieder aus dem Hauptprogramm importieren und dann veröffentlichen müsste. Die DLL ist somit ein Zwischenschritt, der auch entfallen kann. Als Alternative kannst du gleich eine Bibliothek schreiben, die von allen Anwendungen verwendet wird.

    Was du aber auf jeden Fall benötigst ist eine Referenz auf die Assembly, die die gewünschten Funktionen veröffentlicht. Das ist bei anderen APIs nicht immer ganz offensichtlich, aber ein zentraler Bestandteil des Konzepts.
    Gruß
    hal2000
    Ereignisse kannst du einfach im Interface deklarieren. Zum Behandeln muss der Handler registriert werden, der Aufruf wird über den deklarierten Delegaten ausgeführt. Daten werden über Parameter ByVal oder ByRef oder über Rückgabewerte ausgetauscht. Es iat auch ein zentraler Speicher möglich, wenn benötigt. Dieser sollte sich dort befinden, wo er auch verwaltet wird, also im Hauptprogramm.
    Gruß
    hal2000

    singu schrieb:

    Schau dir mal meine Beitragszahl an. Wobei ich bei dir schon die unnötigen Beiträge kenne.

    Wüsste zur Zeit keinen unnötigen Beitrag (unerwünscht eher) von Fatfire. Aber ich habe mal wieder ein Verständnisproblem mit Deiner Fragestellung:

    Wir befinden uns mit .NET in der OO-Welt, insofern kapseln wir Funktionalitäten und Member in einer Klasse, nicht mehr in "Unterprogrammen".Insofern fragst Du also danach wie Du am geschicktesten Dein Unterprogramm in eine Klasse kapselst. Und das solltest Du mittlerweile bei soviel Beiträgen wissen. Klassen reagieren ja auf Ereignisse von aussen, indem sie geeignete Methoden zur Verfügung stellen.

    @Hal2000 denke dass Interfaces hier garnicht nötig sind
    Schau dir mal meine Beitragszahl an.

    Hatte ich schon angeschnitten das Thema, willst Du es wirklich schon wieder aufwärmen? Ist doch nicht schlimm, wenn Du mal einen schlechten Tag hast.

    Wobei ich bei dir schon die unnötigen Beiträge kenne.

    Ich versuche zu helfen und nicht meine Unfähigkeit zur Schau zu stellen. Bei den meisten funktioniert es ziemlich gut, aber einige sind eben lernresistent. Wenn man damit nicht klarkommt, dass ich eben auch mal Tacheles rede, dann tut mir das nicht wirklich leid.

    Aber mein problem ist momentan wie kann mit der API auf Events reagieren, die im Hauptprogramm gefeuert werden

    Beschäftige Dich mal mit Delegaten, AddressOf und AddHandler. Du musst schon die Verweise auf die aufzurufenden Methoden übergeben.

    Gruß FatFire

    singu schrieb:

    Ich programm schon objektorieniert. Bei mir sind fast alle Sachen in Klassen. Nun möchte ich aber eine API schreiben, die auf Events vom Hauptprogramm reagiert. Und das ist mir unklar wie das gehen soll.

    Eine API sind die öffentlichen Member , Methoden und Events einer Klasse ! Basta ..

    Will man für unterschiedliche Klassen die gleiche API benutzen benutzt man ein Interface.

    Deine Klasse "reagiert" auf Ereignisse von aussen durch die Methoden die sie zum Aufruf bereitstellt. Mach bitte mal ein (simples) Beispiel, was Du eigentlich vorhast ...
    Ich befürchte Du hast wirklich miteinander verwuselte Haupt- und Unterprogrammer und keine gekapselten Klassen.

    machen wir noch ein Beispiel:

    VB.NET-Quellcode

    1. ' Definition Klasse A
    2. Class A
    3. ' Member & Programmdefinitionen
    4. ' verwendet Class B
    5. event A_Event
    6. end class
    7. ' Definition Klasse B
    8. Class B
    9. ' Member & Programmdefinitionen
    10. event B_Event
    11. end class

    Klasse A verwendet die Klasse B, daher kann sie auch auf den Event B reagieren. Kann es sein , dass Du möchtest dass Klasse B auf irgendwas in der Klasse A reagiert ? Also von der Oberklasse ?

    Nicht schön aber wurde von Microsoft bei den Controls auch gemacht, indem auf die Containerklasse (=parent) referenziert wurde. Du musst also in B ein Member parent anlegen und der Klasse B beim Constructor mitgeben.

    dann kannst Du in B auf den Typ(parent) abfragen und casten, und danach per AddHandler die Events zuweisen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kangaroo“ ()

    Du verstehst mich immer noch nicht. Ich habe in dem Hauptprogramm mehrere Klassen, und alles objektorieniert. Nun möchte ich für das Programm auch ne API schreiben, diese soll auf Events vom Hauptprogramm reagieren und auch verschiedene Funktionen die im Hauptprogramm verwenden können.

    singu schrieb:

    Du verstehst mich immer noch nicht.

    Hab ich schon öfter bemerkt, wir sprechen definitiv nicht die gleiche Sprache

    singu schrieb:

    Nun möchte ich für das Programm auch ne API schreiben

    Wenn Du Dein Programm in .NET geschrieben hast ist Dein "Hauptprogramm" eine Klasse und Deine API sind die Elemente die als Public definiert wurden, auch die Events.

    Du musst also Dein Hauptprogramm nur als Library kompilieren, eh Voila !
    Also nochmal das Hauptprogramme habe ich in VB.NET geschrieben, das ist ein ausführbares Programm. Nun möchte ich die API als DLL programmieren, diese kann in anderen Programmen eingebunden werden. Nun soll die API auf Events vom Hauptprogramm reagieren und auch Funktionen und Events feuern können, auf die dann das Hauptprogramm reagiert. Das ganze ist ja nicht schwer zu verstehen. das einzigste wo ich nicht weiterkomm, wie kann ich Daten vom Hauptprogramm an die API schicken und andersherum