【问题标题】:Windows Service written in .NET consumed by VB6 application由 VB6 应用程序使用的用 .NET 编写的 Windows 服务
【发布时间】:2012-12-04 14:20:23
【问题描述】:

这个问题是对上一个问题的跟进:link

我必须在 .NET/C# 中开发 Windows 服务。该服务必须由用 VB6 编写的应用程序使用。该服务实现 Quartz.NET 来处理计划任务,并且必须实现侦听器才能启动由 VB6 应用程序启动的功能。

VB6 团队的要求是能够使用 Winsock。因此我必须使用套接字和侦听器。问题是我没有这方面的经验,我更像是一个 WCF 人。

我现在正在查看 TcpListener 类,看看它是否符合要求。

我的第一个问题:如果我实现 TcpListener 类,VB6 团队是否能够使用该服务,同时牢记使用 VB6 的缺点(例如数据结构和二进制格式)?

我的第二个问题:假设 VB6 应用程序必须有 3 个函数可用,并且创建了 1 个侦听器。执行此操作的最佳做​​法是什么?

再次强调:非常感谢任何建议!

【问题讨论】:

  • 这对于编写 VB6 应用程序的人来说确实是一个问题,但是......我想说最简单的方法是使用 CRLF 终止符或类似的 ASCII 编码文本数据来编写它。这应该很容易在 VB 和 .NET 中使用。
  • 您可以在 .NET 端使用 HttpListener msdn.microsoft.com/en-us/library/system.net.httplistener.aspx,在 VB6 端使用一些 HTTP 库(例如 MSXML2.ServerXMLHTTP)。 HTTP 比套接字更高,但库更容易使用。
  • 为什么不通过COM对象暴露服务呢?这对于 VB6 来说是很自然的。让服务实现自托管 WCF 服务,并将客户端(“添加服务引用”)公开为 COM 对象。
  • @John Saunders:我同意你的解决方案。但是,VB6 团队没有。
  • @Marc Gravell:谢谢,这是一个问题。

标签: c# .net vb6 windows-services


【解决方案1】:

以 XML、文本键/值对、JSON 或其他松散序列化格式的形式传递有效负载可以帮助您的协议适应未来。这允许您随意使用甚至添加新的可选方法参数到服务器端。

除了“方法”字段之外,您还可以有一个“协议版本”字段。当发生重大更改(新的必需参数、现有参数类型的更改等)时,您可以在过渡期间使用版本号来处理新旧客户端 - 这可能跨越数年。

就在 TCP 流之上提供消息帧而言,您可以使用某种简单的 EOM 分隔符或包含二进制或文本长度前缀的消息头。

您也可以考虑命名管道。 TransactNamedPipe() 很容易从 VB6 程序中调用。这会为您解决消息边界问题 - 假设您需要 RPC 样式的协议而不是异步发送/接收。

或者您可能会一直使用 MSMQ。专用机器队列不需要大量管理。但即使 VB6 和 .Net 都具有出色的 MSMQ 支持,大多数开发人员对此知之甚少。

【讨论】:

    猜你喜欢
    • 2012-11-15
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多