我想创建一个验证数据并从另一个Windows应用程序访问它的Windows服务,但我是服务新手,我不知道如何启动。
因此,在服务运行时,Windows应用程序应以某种方式连接到服务,发送一些数据并获得响应,无论是真还是假。
答案 0 :(得分:29)
我可以成功处理(几乎)与您相同的问题:
在您的Class:ServiceBase中,代表您的Service类,您可能有:
public Class () //constructor, to create your log repository
{
InitializeComponent();
if (!System.Diagnostics.EventLog.SourceExists("YOURSource"))
{
System.Diagnostics.EventLog.CreateEventSource(
"YOURSource", "YOURLog");
}
eventLog1.Source = "YOURSource";
eventLog1.Log = "YOURLog";
}
现在,实施:
protected override void OnStart(string[] args)
{...}
和
protected override void OnStop()
{...}
处理自定义命令调用:
protected override void OnCustomCommand(int command)
{
switch (command)
{
case 128:
eventLog1.WriteEntry("Command " + command + " successfully called.");
break;
default:
break;
}
}
现在,在您将调用Windows服务的应用程序中使用它:
枚举引用你的方法:(记住,服务自定义方法总是接收一个int32(128到255)作为参数,使用Enum你可以更容易记住和控制你的方法
private enum YourMethods
{
methodX = 128
};
要调用特定方法:
ServiceController sc = new ServiceController("YOURServiceName", Environment.MachineName);
ServiceControllerPermission scp = new ServiceControllerPermission(ServiceControllerPermissionAccess.Control, Environment.MachineName, "YOURServiceName");//this will grant permission to access the Service
scp.Assert();
sc.Refresh();
sc.ExecuteCommand((int)YourMethods.methodX);
执行此操作,您可以控制您的服务。
祝你好运!答案 1 :(得分:16)
检查IPC tag (Interprocess communications) on StackOverflow。有许多方法和技术可以做到这一点:Windows消息,套接字,MMF和同步对象,命名管道,邮件槽等。
作为此特定任务的最简单方法之一,我们创建了我们的CBFS IPC产品,该产品随源代码一起提供。
答案 2 :(得分:4)
如果您使用的是.Net Framework 4,那么内存映射文件提供了一种实现跨进程通信的相当简单的方法。
它非常简单,并且在文档中有很好的描述,并且避免了使用WCF或其他基于连接/远程处理的交互或将共享数据写入中心位置的开销(在运行时以及在开发工作方面)轮询(数据库,文件等)。
有关概述,请参阅here。
答案 3 :(得分:3)
您可以通过使服务主机成为WCF服务并从您的应用程序连接到它来轻松完成此任务。
答案 4 :(得分:2)
我们使用命名管道来实现此目的。但我们的客户端使用C ++实现。如果您的服务和应用程序是在.Net中实现的,则可以使用.Net远程处理。
答案 5 :(得分:1)
在旧版Windows中,您可以将Windows服务配置为与桌面交互。这允许您将用户界面元素直接添加到可以呈现给用户的服务中。从Windows Vista开始,服务无法再与用户直接交互,即无用户界面。
要执行此操作,您要执行的操作是将Windows服务 和 编写为前端Windows应用程序。为了提供两者之间的通信桥梁,我强烈建议使用Windows Communication Foundation(WCF)。
要创建C#Windows服务,您可以按照分步说明here进行操作。
答案 6 :(得分:0)
将其视为远程数据库所有者。假设您有1个数据库,但有10个应用程序需要来自数据库的不同数据,而且您不希望将所有数据打开到每个应用程序。此外,您的应用程序将独立于您的数据库,您的数据层将只是在您的服务中实现,您的应用程序将不具备该逻辑。您可以编写服务并向其他应用程序打开服务。
答案 7 :(得分:0)
您的服务在处理过程中,可以将事件添加到EventLog。
您可以创建另一个与应用程序并行运行的控制台应用程序,并使用事件处理机制来监听该EventLog:
var log= new EventLog("[name of the eventlog]");
log.EnableRaisingEvents = true;
log.EntryWritten += Log_EntryWritten;
然后您立即进行处理:
private static void Log_EntryWritten(object sender, System.Diagnostics.EntryWrittenEventArgs e)
{
Console.WriteLine("Event detected !");
}
您可以阅读EntryWrittenEventArgs对象以获取所有事件详细信息,并在控制台应用程序中显示所需的内容。如果您停止控制台应用程序,该服务将继续运行,并仍然记录到事件日志中。