【问题标题】:Passing an object as a parameter to a windows service将对象作为参数传递给 Windows 服务
【发布时间】:2010-05-24 22:19:40
【问题描述】:

有没有办法将对象传递给 Windows 服务?我知道 myServiceController.Star(string[] arg) 方法,但我需要传递比字符串数组更复杂的对象。 实际上,我不需要将对象作为参数传递,我真正需要的是服务可以使用在 Windows 窗体应用程序中创建的对象。我尝试使用 System.Web.Script.Serialization.JavaScriptSerializer.Serialize 方法将对象转换为 Json,但我不能,因为该对象包含循环引用。我也试过 使用指针,但我不能因为它是托管类型对象。

知道我能做什么吗?

【问题讨论】:

    标签: c# windows service


    【解决方案1】:

    而不是试图传递对象 itslef(这将不起作用,因为服务在单独的进程中执行) - 传递对数据的外部引用。例如,包含序列化对象的文件的路径。

    我假设您的服务也在 .NET 中实现?如果是这样,则使用二进制序列化(BinaryFormatter),因为这将处理循环引用。然后,您可以通过从命名文件加载来反序列化您的服务。

    您可能想考虑如果用户重新启动您的服务会发生什么 - 在这种情况下它从哪里获取数据?不会有启动参数。使用注册表来存储序列化对象的文件名,并让您的服务在启动时从中读取可能更健壮。然后即使在没有启动参数的情况下调用它也会始终找到数据,例如机器重新启动或用户重新启动服务的情况。

    【讨论】:

      【解决方案2】:

      最简单的方法是使用自托管的 WCF 服务。如果服务和客户端在同一台机器上,您可以使用内存中的命名管道绑定。

      http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx

      http://omegacoder.com/?p=101

      或者,如果客户端位于不同的机器上,您可以使用 tcp 绑定 http://msdn.microsoft.com/en-us/library/ms733769.aspx

      【讨论】:

      • 命名管道正是我要建议的。
      【解决方案3】:

      我使用数据库在 Windows 服务和 Windows 应用程序之间共享对象,使用 XML 作为编码格式并自己进行序列化。使用数据库,您可以将通信包装在事务中(用于锁定),添加额外的日志字段,将表视为队列,并在必须从崩溃中重新启动时有一个方便的地方进行恢复。

      【讨论】:

        【解决方案4】:

        这完全取决于 Windows 服务通过什么渠道进行通信。它可以作为 Web 服务进行侦听,运行专有的套接字/端口侦听器,或者(在 .NET 4.0 中)监视内存映射文件或命名管道。

        您的问题提到了一个 (string[] args) 方法,它看起来更像是一个命令行“main”方法。在这种情况下,如果这是 Windows 服务,您可能会看错东西。您不会执行 Windows 服务 EXE 来传递参数....如果您希望它作为服务运行,则不会。

        这些方法中的每一种都有自己的怪癖。但基本上你必须通过引用或值序列化来编组你的数据。

        【讨论】:

          猜你喜欢
          • 2023-03-05
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多