2010-05-24 79 views
5

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

任何想法我能做什么?

回答

3

而不是试图传递对象itslef(由于服务在单独的进程中执行而不起作用) - 传递一个exernal引用数据。例如,包含序列化对象的文件路径。

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

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

0

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

0

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

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

这些方法都涉及自己的怪癖。但基本上你必须通过参考或序列化来整理你的数据。

相关问题