2016-12-12 1 views
0

Ich schreibe ein Robotersimulationsszenario. Die Roboter sind in C programmiert und verwenden Aufrufe an eine spezielle API.Aufruf einer DLL, die dann zurück zu einer API ruft

Mein Plan ist es, die Roboterprogramme zu einer DLL zu kompilieren und zu Beginn der Simulation werde ich die Hauptfunktion der DLL aufrufen, um sie zu starten.

Das Problem, das ich habe, ist, wie die DLL zurück kommunizieren wird. Ich werde ein Beispiel dafür in Pseudo-Code geben

Sagen wir, das Roboter-Programm ist einfach "SetLeftWheelSpeed ​​(100)" und dann "Wait (1500)", damit es das linke Rad zu bewegen und dann auf 1,5s warten.

Wenn ich das Programm des Roboters anrufe, wie würde ich SetLeftWheelSpeed ​​(int Geschwindigkeit) bekommen, um mit meinem Simulator zu kommunizieren? Ich denke DLL als Bibliotheken von Werkzeugen, die Sie eine Methode aufrufen, und es gibt Ihnen eine Rückkehr. Ich muss es in einer Schleife laufen lassen, damit ich nicht einfach Rückgabewerte verwenden kann, glaube ich nicht.

EDIT:

Einige weitere Gedanken hat mich zu einem grundlegenden Problem geführt hat. In meinem gegebenen Beispiel wäre ich nicht in der Lage, den Robotercode zu kompilieren, weil er keine Definitionen für Dinge wie das Bewegen der Räder hat. Dazu müsste ich es mit der API verbinden, die im Simulator ist. Also muss ich vielleicht die API mit dem Robotercode verbinden, den Robotercode mit dem Simulator verbinden und irgendwie den Simulator mit der API verbinden, damit er implementiert, was er tun soll.

+0

@pseudoadbul: Viele Möglichkeiten für eine DLL-Daten in C# zu drücken, wahrscheinlich eines der am einfachsten wäre Nachrichten in ein Rohr zu schreiben, die das C# -Code liest mit einem Stream. Alles hängt davon ab, ob der C# -Code dafür verantwortlich ist, die Werte so einzustellen, dass sie zum Robotertreiber zurückkehren oder ob er nur zuschaut. –

+0

Danke, ich werde das untersuchen. Aber ja, die Kommunikation muss in beide Richtungen gehen. – pseudoabdul

+0

Sie wissen, wie man C# Delegierte benutzt? Wenn sie durch p/invoke übergeben werden, werden sie Funktionszeiger, die es dem nativen Code ermöglichen, einen Rückruf in C# -Code durchzuführen. Beachten Sie, dass der Rückruf von systemeigenem Code vor dem Garbage Collector verborgen ist. Daher müssen Sie verhindern, dass der Delegat nicht erreichbar ist. –

Antwort

0

Ja, das ist möglich.

Bitte gehen Sie durch dieses Tutorial von Code Project, die Sie in dieser Hinsicht hilft.

Außerdem glaube ich, es ist ein Duplikat How to call C++ DLL in C# oder Is it possible to call a C function from C#.Net

+0

Danke, aber ich habe schon alle diese Links gelesen. Das Problem ist keine Funktion über eine DLL aufrufen; So viel habe ich herausgefunden. Das Problem ist, wie man die DLL dazu bringt, zurück zu kommunizieren, damit sie meine API-Programme im Simulator aufrufen kann. – pseudoabdul

+0

Sie müssen das gleiche tun, aber von C bis C#. Überprüfen Sie diese Frage. http://stackoverflow.com/questions/4428267/calling-c-sharp-from-c – Prajwal

Verwandte Themen