Gibt es eine Möglichkeit, ein Ereignis in C# aus einer externen Anwendung auslösen? Insbesondere von Ruby? Ich habe brauchen, um etwas in C# aus einer Rails-Anwendung geschehen zu verursachen.
Antworten
Zu viele Anzeigen?Ich nehme an, dass Sie mit "externer Anwendung" etwas meinen, das außerhalb des Prozessraums des C#-Codes liegt. Ich gehe auch davon aus, dass Sie sich nicht auf C#-Ereignisse beziehen - die kein Konzept sind, das außerhalb der Implementierungsdomäne von .NET existiert - sie sind nicht etwas, das von außerhalb des Codes zugänglich ist.
Die allgemeine Antwort auf diese Frage ist also "ja, es ist möglich" - aber da Sie im Wesentlichen versuchen, prozessübergreifende Benachrichtigungen zu senden, müssen Sie eine Art von IPC-Mechanismus .
.NET verfügt über eine reichhaltige API für die Durchführung von IPC, die von Named Pipes über DCOM bis hin zu Low-Level-Netzwerkprotokollen wie TCP/IP reicht. Welchen Ansatz Sie verwenden, hängt von der Umgebung ab, in der diese Prozesse kommunizieren müssen (auf einem einzelnen Rechner, zwischen Rechnern in einem Intranet, über das Internet usw.). Es hängt auch von der Art der Informationen ab, die Sie austauschen, und davon, wie viel Aufwand Sie bereit sind zu betreiben. Für .NET 3.5-Anwendungen können Sie in der Regel eine unterstützte Implementierung finden, indem Sie WCF als vereinheitlichendes Rahmenwerk .
All dies hängt natürlich davon ab, ob Sie in der Lage sind, die Implementierung (lesen Sie den Quellcode) der .NET-Anwendung zu ändern, in der Sie versuchen, ein Ereignis auszulösen. Wenn Sie nicht tun können, dass, und es gibt keine vorhandenen IPC-Mechanismus in diesem Code, Sie sind wahrscheinlich stecken.
UPDATE: Als Antwort auf Ihren Kommentar:
Was würden Sie empfehlen, wobei Sie der Einfachheit und dem Zeitaufwand den Vorrang geben. Beide Anwendungen laufen auf demselben Rechner, und ich schreibe sie beide selbst
Ich würde die Verwendung von Benannte Rohre . Named Pipes sind ursprünglich ein Unix-Konzept - sie sind aber auch unter Windows verfügbar. Sie haben eine sehr einfache Programmierschnittstelle (sie ähneln der Arbeit mit Dateien) und erfordern nicht viel, um in einem Ein-Maschinen-Szenario verwendet zu werden.
Auf der Ruby-Seite (mit der ich weniger vertraut bin), hier sind einige Links, die Sie vielleicht nützlich finden:
- Named Pipes für die Interprozesskommunikation in Ruby verwenden
- Kommunikation zwischen Ruby und PHP mit Named Pipes
Auf der .NET-Seite finden Sie hier einige relevante Links für weitere Informationen:
Eine offensichtliche Lösung wäre die Verwendung einer Art Netznachricht. Entweder eine kurzlebige TCP/IP-Verbindung oder - insbesondere, wenn sich beide Anwendungen auf demselben Host befinden - ein einfaches UDP-Paket.
Die C#-Anwendung würde Verbindungen annehmen (falls TCP), die Ereignisse aus dem Socket lesen und sie schließlich verarbeiten.
Um Martins Antwort zu erweitern, könnten Sie ein Nachrichtenprotokoll in Betracht ziehen, dessen Bibliotheken in beiden Zielsprachen verfügbar sind. Etwas wie Stampfen kommt mir in den Sinn.
Sie könnten wahrscheinlich etwas mit Nachrichten-Warteschlangen machen, insbesondere eine, die mehrere Plattformen und Sprachen unterstützt, wie ActiveMQ . Ich würde davon ausgehen, dass es die Möglichkeit hat, einen Handler für ein Ereignis zum Empfang einer Nachricht hinzuzufügen, so dass Sie eine asynchrone Zustellung erhalten können.