2010-12-08 6 views
3

Was die Frage sagt. Wie können Sie mit der WCF-Welt aus einer nativen Anwendung, die .NET nicht zur Verfügung hat, interagieren?Kann WCF mit nativen (C++) Anwendungen verwendet werden?

EDIT: Sorry, ich hätte konkreter sein sollen, da es scheint, dass WCF ein so breites Spektrum abdeckt. Ich dachte an den Fall, in dem Sie mehrere Anwendungen haben, die WCF/TCP-Kommunikation als ihren Kommunikations-/IPC-Mechanismus verwenden, und Sie müssen nun eine native (C++) Anwendung integrieren, die nicht .NET verfügbar ist.

+1

Was meinst du genau? Möchten Sie einen WCF-Dienst anrufen, ihn hosten, einen erstellen? Welche Art? –

+1

Was meinst du mit "Schnittstelle" damit? Beispielsweise könnten Sie durch andere C++ - APIs möglicherweise einen Client (oder Server) für eine WCF-Anwendung erstellen (mit SOAP), aber direktes Verwenden der MS-Bibliotheken ist wahrscheinlich ohne verwaltetes C++ nicht möglich. –

Antwort

5

WCF ist Protokoll agnostisch - naja fast. Aber Sie müssen dies in der Art und Weise betrachten, wie Sie mit WCF kommunizieren werden:

Solange Sie Nachrichten senden können, wie die andere Seite verwenden können, sollten Sie in Ordnung sein.

1) named-Rohrbindung: Es wird Anstand und schwierig zu verwenden außerhalb .NET

2) TCP-Bindung: Es ist schwierig, Anstand und außerhalb zu verwenden .NET

3) basicHttp Bindung: Es ist eine der am einfachsten zu implementieren außerhalb

4) wsHttp Bindung: solange Sie eine nativeLibrary, die ws * Nachrichten erstellen und konsumieren können, sind Sie in Ordnung, aber ein bisschen schwierig.

5) REST API: Es ist in der Tat die einfachste und ich empfehle diesen eine , wenn Sie eine Kontrolle darüber, welche Art von Service ist zur Verfügung gestellt.

+0

Hallo Aliostad, kann Option Nummer 5 (REST) ​​verwendet werden, wenn Sie Interprozesskommunikation auf demselben Computer benötigen und Sie entweder einen Java- oder C++ - Clientprozess haben, der Daten an einen WCF-REST-Service senden muss? –

0

Ich habe keine Ahnung, was "WCF Welt" du redest. WCF kann verwendet werden, um SOAP-Webdienste entweder mit den alten SOAP 1.1-Formaten oder mit der modernen WS-Sicherheit zu implementieren. Ihre Frage lautet also: Kann ich einen SOAP-Webdienst von C++ aus aufrufen? Die Antwort lautet offensichtlich "Ja".

5

Ja, es ist ist möglich, eine nicht verwaltete C++ - Anwendung mit anderen Anwendungen über WCF kommunizieren zu lassen. In meiner speziellen Situation habe ich eine Legacy-MFC-Programmdatei so geändert, dass sie über WCF mit einem Windows-Dienst kommuniziert.

Die Grundidee ist, den WCF-Client-Code in einer .NET-Assembly mit C# zu schreiben, da es einfacher ist, dies zu tun. Verwenden Sie dann eine C++ - DLL, um die Lücke zwischen dem nicht verwalteten C++ - Code und der .NET-Assembly zu überbrücken.

Ich habe einige Schritt-für-Schritt-Anweisungen, wie dies zu tun ist here.

+0

1.: Vielen Dank für dieses Heads-up und den Link zu Ihrer (tollen!) Beschreibung. 2 .: Leider habe ich das selbe Problem wie User-Galets im Q, mit dem ich verlinkt bin, nämlich dass ich es vermieden hätte, die CLR in meinen ansonsten 100% nativen Prozess einzubinden. –

+0

Verstanden. Drei Punkte. Erstens ist die Interaktion mit der CLR auf die C# -Ansammlung (offensichtlich) und die C++ - Brücken-DLL beschränkt. Die Lösung erzwingt keine direkte CLR-Abhängigkeit von Ihrer nativen C++ - Anwendung und DLLs. Zweitens ist .NET 3.5 SP1, beginnend mit Windows 7, als Betriebssystemkomponente enthalten und wird standardmäßig installiert. Drittens können Sie für ältere Windows-Versionen immer die erforderlichen .NET-Installationsprogramme bereitstellen. –

+0

Ich sollte wahrscheinlich hinzufügen, dass ich nicht über die Abhängigkeit per se besorgt bin, sondern darüber, dass die CLR-VM in meinem nativen Prozess ausgeführt wird, um die Kommunikation zu vereinfachen. –

1

Die "WCF World", die kein Standard SOAP Protokoll verwendet, ist das Problem. NetTcpBinding und NetNamedPipeBinding benötigen eine Art von nicht verwalteten zu managed Bridge wie beschrieben. Also die Antwort nicht offensichtlich "ja". Es hängt von der Bindung ab, die von dem WFC-Dienst bereitgestellt wird.

2

Sie können WCF-Dienste mit systemeigenem Code (ohne Bridging zu verwaltetem Code) verwenden, indem Sie die Betriebssysteme Windows Web Services API unter Windows 7 und Windows 2008 R2 oder höher verwenden. WWSAPI ist eine native Code-Implementierung von SOAP, die die Protokollfamilie WS- * und .NET- * unterstützt und einen minimalen Speicheraufwand hat.

WWSAPI enthält ein handliches WsUtil tool zum Generieren von C-Stub-Code für die Schnittstelle aus dem Dienstbeschreibungsdokument. Sie können ein WSDL-Service-Beschreibungsdokument mit dem Service Model Metadata-Tool SvcUtil documented here generieren.

Es gibt auch helpful MSDN blog Artikel, der zeigt, wie ein WCF-Dienst von systemeigenem Code mit WWSAPI aufgerufen wird.

Wenn Sie Codierung in C++ 11 und WCF-Service stellt Schnittstellen REST, dann gibt es eine modernere Alternative API (auch von Microsoft) für Casablanca genannt REST-Services raubend, auf MSDN here dokumentiert und auf codeplex here gehostet.

Verwandte Themen