我研究过COM服务器和Windows服务,但我不确定哪种最适合我的目的或如何做。我想要的是可以无限期地启动和运行的东西,它保存一个对象,以便其他进程或应用程序获得对该对象的引用(或向服务器发出请求)以修改或查询其状态。
服务器本质上是一个应用程序,它通过串行端口处理命令到设备并维护设备的内部状态。
我现在有用C#编写的设备通信和持久性功能,它可以在每个进程的基础上创建和运行,但显然我希望它实例化一次并独立于其他进程运行。
我读过的COM教程只让我感到困惑,因为我不完全确定这是否是我想要的,我希望有更多的.Net方式来做到这一点。
非常感谢任何帮助!
答案 0 :(得分:2)
这似乎非常适合Windows服务。我应该说我不是.net程序员,但我知道你可以用.net创建服务。只要您知道可以使用.net操作串口,就应该好了。
-don
答案 1 :(得分:1)
您的要求有点矛盾 - 如果服务器必须无限期运行,无论是否有客户端要服务,并且该进程必须在所有客户端之间共享,无论他们运行的是什么会话,Windows服务是可行的方式。
如果您希望服务器仅在有客户端时运行,并且可能(或不希望)希望这些客户端共享同一服务器进程,则可以选择COM Out Of Process Server。
如果是COM,则必须使用DCOM与服务器进程通信。如果是服务,您可以使用DCOM,命名管道,RPC或其他一些IPC机制。
如果你希望用C#编写服务器代码,DCOM似乎有点奇怪的选择 - 可以用C#创建DCOM服务器,但它确实很尴尬。正如Kevin所说,WCF / WAS / Remoting可能是更容易的选择。但请记住,这样的解决方案几乎必然会有更高的开销w.r.t.内存消耗比本机COM服务器或服务。如果要在客户端计算机上安装这个软件,我宁愿选择原生解决方案。
答案 2 :(得分:1)
你似乎要求两件事 -
Windows Service是第一个很好的解决方案。 Windows服务充当自定义逻辑的应用程序主机。它通过通用UI和API为您提供启动/停止和轻量级监视和配置功能。在C#中构建Windows服务很容易。从命令行,应用程序和GUI工具轻松启动和停止Windows服务。
将WCF视为主要的通信接口。 WCF可用于构造Windows服务公开的外部接口。如果要从.NET或HTTP客户端(REST或SOAP)连接到应用程序(服务),则WCF将为您工作。
COM ....您在COM所处理的地方遇到的困惑是由于COM将接口机制(IDispatch,IUnknown等)与托管+生命周期模型(本地服务器,Inproc服务器,远程服务器,根据请求自动启动等)。 COM中的托管和生命周期工作有效,但总是相当渺茫。很难知道哪些服务已经启动,需要多长时间。很难按需启动和停止。
COM,在这种情况下,像WCF一样,主要是作为通信接口感兴趣。如果要使用基于组件的界面连接到服务,COM可能是Windows服务托管的良好补充。
COM和WCF(REST或SOAP)不是互斥的,实际上许多应用程序都暴露了多个接口。您可以选择做一个,或另一个,或两者兼而有之。没有错误的答案,这取决于您的要求。
如果我这样做,我会使用Windows服务,同时我也会公开该服务的COM接口as described here。生命周期和托管内容由Windows服务负责。然后可以通过COM访问该服务,这意味着几乎可以通过任何编程或脚本语言/环境访问。 Javascript,VB6,Excel或OFfice,Python,Perl等
我还考虑从服务中公开WCF接口。这也允许任何REST客户端连接。将WCF视为无线电话,将COM视为固定电话。有时你只想要一个。有时你想要两者。
答案 3 :(得分:0)
我会为此构建一个Windows Communication Foundation(WCF)服务,并使用可用的许多绑定之一来公开它。您可以通过HTTP / SOAP,HTTP / REST,TCP / Binary,MSMQ等从同一服务公开它。如果您使用的是Windows 2008,则可以通过Windows激活服务(WAS)激活它。如果您有其他Windows操作系统,则应编写可以向服务控制管理器(SCM)注册的Windows服务。这里有很多选项,但我绝对倾向于使用WCF来创建您的服务。 WCF为您提供了很多“管道”。无需重新发明所有这些。希望这会有所帮助。