有没有办法将对象传递给Windows服务?我知道方法myServiceController.Star(string [] arg)但我需要传递一个比字符串数组更复杂的对象。 实际上,我不需要将对象作为参数传递,我真正需要的是服务可以使用在Windows窗体应用程序中创建的对象。我已经尝试使用System.Web.Script.Serialization.JavaScriptSerializer.Serialize方法将对象转换为Json但我不能,因为该对象包含循环引用。我也试过了 使用指针,但我不能因为它是一个托管类型的对象。
知道我该怎么办?
答案 0 :(得分:3)
而不是尝试传递对象itslef(由于服务在单独的进程中执行,因此无法工作) - 传递对数据的exernal引用。例如,包含序列化对象的文件路径。
我假设您的服务也是在.NET中实现的?如果是,则使用二进制序列化(BinaryFormatter),因为这将处理循环引用。然后,您可以通过从指定文件加载来反序列化服务。
您可能想要考虑如果用户重新启动您的服务会发生什么 - 在这种情况下它从何处获取数据?没有启动参数。使用注册表来存储序列化对象的文件名,并在启动时从中读取服务可能会更加健壮。然后,即使在没有启动参数的情况下调用也会始终找到数据,例如机器重新启动,或者用户重新启动服务。
答案 1 :(得分:2)
最简单的方法是使用自托管WCF服务。如果服务和客户端位于同一台计算机上,则可以使用名为管道绑定的内存。
http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx
或者如果客户端驻留在不同的计算机上,则可以使用tcp绑定 http://msdn.microsoft.com/en-us/library/ms733769.aspx
答案 2 :(得分:0)
我使用数据库在Windows服务和Windows应用程序之间共享对象,使用XML作为编码格式并自行进行序列化。使用数据库,您可以将通信包装在事务中(用于锁定),添加额外的字段以进行日志记录,将表视为队列,并且如果必须从崩溃中重新启动,则可以方便地进行恢复。
答案 3 :(得分:0)
这完全取决于Windows服务通过哪些渠道进行通信。它可以作为Web服务进行侦听,运行专有的套接字/端口侦听器,或者(在.NET 4.0中)监视内存映射文件或命名管道。
您的问题提到了一个(string [] args)方法,它看起来更像是命令行“main”方法。在这种情况下,如果这是一个Windows服务,你可能会看错了。您不执行Windows服务EXE来传递参数....如果您希望它作为服务运行,则不会。
这些方法中的每一种都涉及到它们自己的怪癖。但基本上你必须通过引用或值序列化来编组数据。