从 VB6 到 WCF 的命名管道
Posted
技术标签:
【中文标题】从 VB6 到 WCF 的命名管道【英文标题】:Named Pipes from VB6 to WCF 【发布时间】:2010-09-21 15:12:14 【问题描述】:我可以让 VB6 应用调用命名管道连接到使用 C# 编写的带有 WCF 端点的服务吗?
VB6 项目利用命名管道与用 C++ 编写的服务进行通信。我想将 C++ 服务转换为 C#(最好是 .NET 4.0)。
VB6 项目使用 Win32 调用 CallNamedPipes 向服务器发送消息。消息的有效负载是一个字符串,由以下结构组成。
[command][data length][data if approprate to the message]
此时我无法转换应用程序的 VB6 端,但我想知道是否可以依靠 CallNamedPipe 函数向新的 WCF 服务发送消息,以及它们是否能很好地协同工作。我会看到 WCF 服务的合同方面基本上是一种接受我将解析的字符串的方法。
另外,由于 CallNamedPipes 可以在 outputBuffer 参数中接收返回数据,WCF 是否能够适应这一点?合同会是这样吗……
string DoSomething(string command)
感谢您的帮助!
布赖恩
【问题讨论】:
【参考方案1】:WCF 非常好,但在通信通道的两边都使用 WCF 时真的很出色。尝试将遗留代码连接到 WCF 服务充其量是棘手的。
让您的 C# 服务直接使用 NamedPipeServerStream 可能会更容易。这将使您完全控制如何处理连接和传输。话虽如此,没有什么可以阻止您同时执行这两种操作(在同一程序中实现自定义 NamedPipeServerStream
通道,以及公开一个或多个 WCF 端点)。如果您还想升级客户端,这将提供一种前进的方式。
【讨论】:
使用 NamedPipeServerStream,我可以发回返回数据还是基本上在管道上进行某种类型的双向通信,以便客户端需要“监听”返回数据?我很想升级客户端,但现在它不在范围内,也不确定是否会升级。 @Brian:您基本上只需执行您的 C++ 程序当前正在执行的任何操作 - 可以在单个管道中进行双向通信 - 但我不确定您当前的程序期望什么. 目前 VB6 代码使用类似“GiveMeSomeInfo”的命令调用服务,该服务返回 CallNamedPipe 提供的 outputBuffer 中的信息。所以实际上它就像远程方法调用一样使用。就像你说的,我可以做 C++ 代码正在做的事情,然后 PInvoke Win32 代码来设置命名管道并返回数据。我有点希望让 WCF 工作。 @Brian:我更认为你可以在 C# 端使用 NamedPipeServerStream 来模仿 C++ 代码对 Win32 API 所做的事情......它确实是一个相当薄的 API 包装器(它让您使用 Stream 类等)。 不幸的是,WCF 确实规定了格式(在通道的两侧),因此要使其与遗留代码一起干净地工作并非易事..【参考方案2】:为什么不编写一个包装 WCF 客户端代理的 ComVisible 类,您的 VB6 代码可以像调用任何其他 COM 库组件一样调用它。
【讨论】:
【参考方案3】:您能否使用 PInvoke 直接从您的 C# 代码调用 C++ 命名管道应用程序
然后将 pinvoke 服务包装在 WCF 服务周围以便于互操作。
【讨论】:
我想从 VB6 调用一个新的 C# 应用程序。目标是摆脱 C++ 代码。以上是关于从 VB6 到 WCF 的命名管道的主要内容,如果未能解决你的问题,请参考以下文章