Frage

Wir haben eine monolithische MFC GUI-Anwendung, die das Ende von Leben in C ++ nähert. Wir planen, neue Funktionen in C # bauen und übergeben Daten zwischen den einzelnen App.

Die Frage ist: Was ist der beste Ansatz, um Daten zwischen C für das Bestehen ++ und C #?

Weitere Informationen:
Beide Enden ein GUI-Frontend und wird wahrscheinlich nur einfache Daten wie IDs übergeben müssen und möglicherweise einen Mechanismus haben, wo er zeigt auf die andere App, welche Verfahren / Funktion zu nutzen.
ZB Eine der Anwendungen wird ein CRM-System in C #, dass, wenn eine Zeile in einem Raster doppelt so hoch ist die customerId passiert geklickt würde sagen, und eine Meldung, dass die Kunden in den Kunden Form der MFC-Anwendung zu öffnen.

ich ein wenig Forschung getan haben, scheinen die Optionen Windows Messaging, Speicherzuordnung, Named Pipes oder so etwas wie Windows Sockets zu sein. In diesem Stadium sind wir Neigung zu Named Pipes, würden aber wirklich andere Ratschläge oder Tipps oder andere Völker Erfahrungen zu schätzen wissen.

War es hilfreich?

Lösung

Persönlich würde ich mit so etwas wie Named Pipes denken, da sie leicht aus dem C ++ Seite zu verwenden und die System.IO.Pipes auf der .NET-Seite auch.

Es wäre auch den Weg des geringsten Widerstandes wahrscheinlich, wenn Sie die anderen nicht .NET Bits der App im Laufe der Zeit ersetzen planen.

Andere Tipps

Nehmen Sie Ihre Auswahl:

  • Dateien
  • Named Pipes <- Meine Empfehlung
  • Shared Memory
  • Steckdosen
  • COM
  • Windows-Nachrichten

Warum Named Pipes?

  • Gibt Ihnen einen FIFO-Weg für freie Arbeits (wie Steckdosen, aber nicht gemeinsam genutzten Speicher mögen)
  • Kann in beiden Richtungen leicht kommunizieren
  • Nun auf allen Plattformen unterstützt
  • Einfach zu bedienen
  • Sichere Datenübergabe und Abgabe
  • Kann sein blockiert und nicht blockierende
  • Können Daten lesen, ohne zu entfernen (im Gegensatz zu Buchsen)
  • Kann erweitert werden, leicht eine dritte App aufzunehmen.

In .Net verwendet nur System.IO.Pipes.

In C ++ Verwendung CreateNamedPipe und Create.

Sie können mit auch P / Invoke von der verwalteten Seite - dies nützlich wäre, wenn die MFC-Anwendung, um einen C-API hat. Sie können auch COM von beiden Seiten verwendet werden.

Die Optionen, die Sie Liste sind sicherlich gültig, aber man könnte auch COM berücksichtigen.

I Sockets verwenden würde (TCP) - beide MFC und .NET haben direkte Unterstützung für sie

.

Haben Sie wirklich brauchen zwei Prozesse?

Unmanaged C ++ und Managed C # -Code durchaus in der Lage ist, im gleichen Prozess zu arbeiten, und mit einer kleinen Schicht von Managed C ++ / CLI, könnten Sie die Komplexität der Interprozess-Kommunikation mit einfachen Funktionsaufrufen ersetzen.

Meine Picks wären entweder Standard-Fenstermeldungen (z WM_FOO) oder DCOM:

  • Nachrichten würden funktionieren, solange die Kommunikation ist sehr einfach, und der Aufwand es bei der Einrichtung ist minimal. Wenn Sie die Kommunikation bis auf eine oder zwei ganze Zahlen pro Nachricht kochen können, würde dies wahrscheinlich ein guter Anfang sein. Wenn beide Anwendungen bereits fensterbasierte Anwendungen sind sie beide bereits Nachrichtenschleifen, so sind Sie bereits die meisten der Weg dorthin.

  • DCOM erfordert viel mehr Programmierer Aufwand, aber es ist schön, dass Sie eine reichere Schnittstelle definieren und vermeiden komplexe Botschaften zu / von binärer Form umwandeln zu müssen. Wenn Sie diesen Weg gehen, ist CoRegisterClassObject der Ausgangspunkt für ein Objekt über DCOM veröffentlichen. Ich habe nie versucht, dies aus einer C # -Anwendung zu tun, aber im Prinzip sollte es durchaus möglich sein

Angenommen, Sie die Quelle mit dem Legacy-App haben, finden Sie, wenn Sie nicht alle „Arbeitspferd“ Code als DLL kompilieren können, rufen Sie dann die einzelnen Funktionen / Fenster von dort. Sobald Sie, dass arbeiten, können Sie einfach C ++ Wrapper um die Sie benötigen, Funktionen Managed schreiben und diejenigen, die aus C # -Code aufrufen. Der gesamte Prozess kann weniger eingenommen hat, als einen Tag, wenn Sie Glück haben.

Ich würde sagen, C ++ / CLI, wenn Sie müssen über das .NET Framework auf allen Systemen bestehenden keine Sorge die App laufen auf, und COM anders. Es wäre wirklich davon ab, was Sie am bequemsten und vertraut mit, though. Ich mag die bestehende ‚Funktionsaufruf‘ Struktur von C ++ / CLI und COM (im Gegensatz zu mit anderen Protokollen Aufbau), aber das ist nur meine Meinung.

Ich bin derzeit mit COM eine .NET-Komponente Funktionen hinzuzufügen, vor allem wegen der Notwendigkeit, mit Fallbacks noch funktionieren, wenn .NET nicht vorhanden ist, aber das ist spezifisch für meine Bedürfnisse, wo maximale Einsatz vorzuziehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top