WCF能够与本地的(C++)应用程序一起使用吗?

4

问题是如何从没有.NET的本地应用程序与WCF“世界”进行接口交互?

编辑:抱歉,我应该更具体一些,因为WCF涵盖了如此广泛的范围。我想到的情况是,您有几个使用WCF/TCP通信作为它们的通信/IPC机制的应用程序,并且现在需要集成一个没有.NET可用的本地(C++)应用程序。


1
你具体是什么意思?你想调用一个WCF服务、托管一个、还是创建一个?你指的是哪种类型? - Lou Franco
1
你说的“interface”是什么意思?例如,通过其他C++ API,你可能构建一个客户端(或服务器)到WCF应用程序(使用SOAP),但直接使用MS库可能是不可能的,除非使用托管C++。 - Kevin Anderson
5个回答

5

WCF是协议无关的——几乎是这样。但你需要考虑与WCF通信的方式:

只要你能发送消息,对方就可以使用,你应该没问题。

1)命名管道绑定:它是专有的,并且在.NET之外难以使用。

2)TCP绑定:它是专有的,并且在.NET之外难以使用。

3)basicHttp绑定:它是最容易在.NET之外实现的之一。

4)wsHttp绑定:只要你有一个能够创建和消费ws*消息的本地库,你就可以使用,但有点困难。

5)REST API:确实是最容易的,我建议使用它如果你对所提供的服务类型有控制权


你好,Aliostad。当您需要在同一台计算机上进行进程间通信,并且您有一个需要向WCF REST服务发送数据的Java或C ++客户端进程时,是否可以使用选项5(REST)? - public wireless

5
是的,使用WCF可以让未经管理的C++应用程序与其他应用程序进行通信。在我的特定情况下,我修改了一个传统的MFC可执行文件,使其使用WCF与Windows服务通信。
基本思路是使用C#编写.NET程序集中的WCF客户端代码,因为这样做更容易。然后,使用C++ dll来弥合未经管理的C++代码和.NET程序集之间的差距。
这里有一些逐步说明,说明如何完成此操作。请点击这里

1st: 感谢您的提醒和链接到您(很棒!)的描述。 2nd: 不幸的是,我和您链接问题中的用户galets一样,即我本来想避免将CLR引入我的纯本地进程。 - Martin Ba
明白了。有三点需要注意。首先,与CLR的交互仅限于C#程序集(显然)和C++“桥接”dll。该解决方案不会将直接CLR依赖项强加到您的本机C++应用程序和dll中。其次,从Windows 7开始,.NET 3.5 SP1作为操作系统组件包含在内,并默认安装。第三,对于旧版本的Windows,您始终可以提供所需的.NET安装程序。 - Matt Davis
我可能应该补充说明一下,我并不关心依赖项本身,而是为了促进通信而纯粹在我的本地进程中运行CLR VM。 - Martin Ba

3
您可以使用Windows 7和Windows 2008 R2或更高版本的操作系统上的Windows Web Services API,从本地代码中(无需桥接到托管代码)消耗WCF服务。 WWSAPI是SOAP的本地代码实现,支持WS-*和.NET-*协议系列,并具有最小的内存开销。
WWSAPI包括一个方便的WsUtil工具,用于从服务描述文档生成C存根代码的接口。 您可以使用Service Model Metadata工具在此处记录的SvcUtil生成WSDL服务描述文档。
还有一篇有用的MSDN博客文章演示了如何使用WWSAPI从本地代码调用WCF服务。
如果你正在使用C++11编程,并且你的WCF服务暴露了REST接口,那么有一个更现代的替代API(同样由Microsoft提供)可以用于消费REST服务,名为Casablanca,文档在MSDN这里,托管在codeplex这里

1

使用非标准SOAP协议的“WCF World”是问题所在。NetTcpBindingNetNamedPipeBinding需要某种未受管控的到托管的桥接,如所述。所以答案并不明显,“是”还是“否”取决于WFC服务提供的绑定。


0

我不知道你所说的"WCF世界"是什么。WCF可以用于实现SOAP Web服务,可以使用旧的SOAP 1.1格式或现代的WS-Security。因此,你的问题变成了:我能从C++调用SOAP Web服务吗?答案显然是“可以”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接