将对象作为参数传递给Windows服务

5
有没有办法将一个对象传递给Windows服务?我知道有一个方法myServiceController.Start(string[] arg),但是我需要传递比一个字符串数组更复杂的对象。
实际上,我不需要将对象作为参数传递,我真正需要的是服务可以使用在Windows窗体应用程序中创建的对象。我尝试使用System.Web.Script.Serialization.JavaScriptSerializer.Serialize方法将对象转换为Json,但是由于对象包含循环引用,所以我无法这样做。我还尝试使用指针,但是由于它是托管类型对象,因此我无法这样做。
您有什么想法吗?
4个回答

3
不要试图传递对象本身(由于服务在单独的进程中运行,这是行不通的)- 传递对数据的外部引用。例如,包含序列化对象的文件的路径。
我假设您的服务也是使用.NET实现的?如果是这样,那么请使用二进制序列化(BinaryFormatter),因为它将处理循环引用。然后,您可以通过从命名文件中加载来在服务中反序列化。
您可能需要考虑一下,如果用户重新启动您的服务会发生什么 - 在这种情况下,它从哪里获取数据?将没有启动参数。使用注册表存储序列化对象的文件名,让您的服务在启动时从其中读取,可能更加健壮。然后,即使在没有启动参数的情况下调用,例如机器重新启动或用户重新启动服务,它仍然能够找到数据。

2

1
命名管道正是我要建议的。 - AaronLS

0

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


0

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

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

这些方法各有其独特之处。但基本上,您必须通过引用或值序列化来编排数据。


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