不同基于C#的服务之间的通信

不同基于C#的服务之间的通信,c#,windows,windows-services,interprocess,C#,Windows,Windows Services,Interprocess,两个不同的服务之间是否有通信方式?我有一个已经运行的服务。有没有办法创建第二个服务,可以附加到第一个服务并向其发送和接收日期 我还想从控制台应用程序访问Windows服务并附加到它。有可能吗?您可以尝试使用以下方法实现此功能: IPC(进程间通信通过) 共享内存() 套接字(TCP/IP) 使用WCF的示例: 其他示例: 一切都取决于您使用的.NET Framework的版本。如果您使用.NET3.0及以上版本,则可以查看。如果没有,那么您可以自己搜索关键字(CreateFileMappin

两个不同的服务之间是否有通信方式?我有一个已经运行的服务。有没有办法创建第二个服务,可以附加到第一个服务并向其发送和接收日期


我还想从控制台应用程序访问Windows服务并附加到它。有可能吗?

您可以尝试使用以下方法实现此功能:

  • IPC(进程间通信通过)
  • 共享内存()
  • 套接字(TCP/IP)
使用WCF的示例:

其他示例:


一切都取决于您使用的.NET Framework的版本。如果您使用.NET3.0及以上版本,则可以查看。如果没有,那么您可以自己搜索关键字(CreateFileMapping、MapViewOfFile、CreatePipe…。

首先,我将使用tcpclient和tcpserver

即使需要发送的数据比日期更复杂,也可以轻松地对其进行序列化/反序列化

对于发送和接收日期,这是最简单的选择

如果服务在不同的机器上运行,socks也可以工作,而共享内存和命名管道则不行

示例代码

// Create a thread running this code in your onstarted method of the service

using System.IO;
using System.Net;
using System.Net.Sockets;

var server = new TcpListener(IPAddress.Parse("127.0.0.1"), 8889);
server.Start();

while(true) {
  var client = server.AcceptTcpClient(); 

  using(var sr = new StreamReader(client.GetStream())) {
    var date = DateTime.Parse(sr.ReadToEnd());
    Console.WriteLine(date);
  } 
}

// In the console

using System.IO;
using System.Net;
using System.Net.Sockets;

var client = new TcpClient("localhost",8889); 
using(var sw = new StreamWriter(client.GetStream())) {
  sw.Write(System.DateTime.Now);
}

你能告诉我们更多吗?您能够修改正在运行的服务的代码吗?如果没有,它支持/使用什么协议?第一个服务运行exe文件,例如notepad.exe。从service2,我想在notepad.exe中写入数据,尽管service1.Windows服务无法运行类似“notepad.exe”的exe文件。这没有任何意义。为什么不从单个服务保存到日志文件?@Cody Gray:acutally windows服务可以运行“notepad.exe”之类的文件。您可以将服务权限设置为允许与桌面交互。@HABJAN:仅当您仍在运行Windows XP时。那是10年前的事了。由于安全原因,Windows Vista和更高版本已经破坏了与桌面交互的能力。除了在早期版本的Windows中进行测试之外,您不应该将其用于任何其他用途,但开发人员没有听从,客户抱怨恶意软件和Windows普遍缺乏安全性。使用套接字?我怎么做/哪一个是最简单的解决方案?如果我的一个应用程序是控制台应用程序,那么我可以创建一个指向windows服务的链接并与之通信吗?@elisa:通过使用套接字,我在考虑标准的客户端-服务器TCP/IP通信,唯一的问题是所有东西都可以在本地主机上工作。看看:,在这一页的末尾有一个小例子。如果你问我,我会选择WCF/NamedPipes.In.NET2.0,你可以使用.NETRemoting。如果我不能使用WCF,我更喜欢它,而不是上面提到的方法。@Dmitry Lobanov:yep。可以使用带有全双工通信的.net远程处理。不要使用.net远程处理。所有MSDN文档都说.NET远程处理是一种遗留技术,它是为了向后兼容而维护的。所有新的分布式开发都应该使用WCF。两个服务都在同一台机器上运行。第一个服务是使用regedit的节点。我只想创建第二个服务并访问第一个服务,访问它的应用程序并发送数据。你能给我简要介绍一下我该怎么做吗?thxor..如果我运行一个控制台应用程序,我怎么能连接到一个服务?我不能说在本地系统上使用套接字是一个好的IPC机制,特别是对于初学者。当然,创建windows服务也不是。我展示的类很多都是高级抽象hi.thx。如果我有一个exe文件在我的机器上运行,我可以根据你的ex在它们之间建立tcp ip连接吗?