问题描述
我的 Windows Server 2008 VPS 中有一个 winform 应用程序(.exe 文件)。
此应用应每 5 分钟从互联网获取一些数据并将其保存到文本文件中。
我的 VPS 在 2 或 3 天后无故重启。
我想强制我的服务器在启动时运行该应用程序并在每次重新启动时执行它。
为此,我遵循了以下说明:
很简单。过程是。
问题是该文件在启动时执行,但登录到 Windows 后我看不到它的表单正在运行。
我可以看到该应用正在任务管理器中运行。
登录windows后如何看到那个winform?(我需要GUI)
我的意思是我的应用程序必须在登录之前运行,并且它应该位于系统托盘上,我可以从中“显示”交互界面。
如果在 c# 编程中有一种方法可以在登录后显示该应用程序,请分享。
解决方法
您需要将应用程序的服务与 UI 分开。
- 服务可以是 Windows 服务或在启动前运行的控制台应用程序。
- 用户界面可以是在用户登录后运行的 Windows 窗体应用程序。
- 要在服务和 Windows 应用程序之间进行通信,您可以使用 IPC 解决方案,例如自托管 WCF 或自托管 Web API。
Windows 服务 + 安装程序中托管的 GUI 应用程序 + WCF 服务
在这里,我将分享一个分步示例,包括:
- Windows 服务
- 托管在 Windows 服务中的 WCF 服务
- 一个调用 WCF 服务方法的 WinForms 应用程序
- 安装 Windows 服务和 WinForms 应用程序并将应用程序置于启动状态的安装程序。
因此,安装后该服务将在 windows 启动时启动。 GUI 应用程序也将在用户登录应用程序时启动。然后,如果您单击一个按钮,它将显示一条来自服务的消息。
克隆或下载:
服务层项目
-
创建类库项目(ServiceLayer)
-
向类库添加新的 WCF 服务。 (MyWCFService)
-
修改合同:
[ServiceContract] public interface IMyWCFService { [OperationContract] string Echo(string message); }
-
修改 MyWCFService 的实现:
public class MyWCFService : IMyWCFService { public string Echo(string message) { return message; } }
-
添加 Windows 服务。 (MyWindowsService)
-
修改服务的实现:
partial class MyWindowsService : ServiceBase { ServiceHost host; public MyWindowsService() { InitializeComponent(); } protected override void OnStart(string[] args) { host = new ServiceHost(typeof(MyWCFService)); host.Open(); } protected override void OnStop() { host.Close(); } }
-
双击 MyWindowsService,然后右键单击表面并选择添加安装程序
-
双击 ProjectInstaller.cs 并从组件列表中选择 serviceInstaller1,然后在属性窗口中将 StartType 设置为自动。
-
选择 serviceProcessInstaller1,然后在属性窗口中,将 Account 设置为 LocalSystem。
-
添加 C# 文件。 (程序.cs)
-
将 Program.cs 类的内容修改为:
static class Program { static void Main() { ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new MyWindowsService() }; ServiceBase.Run(ServicesToRun); } }
UILayer 项目
-
创建 Windows 窗体应用程序 (UILayer)
-
添加对 MyServiceLayer 项目的引用
-
在设计模式下打开 Form1,在它上面放一个按钮并双击来处理它的点击事件并使用以下代码:
private void button1_Click(object sender,EventArgs e) { ChannelFactory<IMyWCFService> factory = new ChannelFactory<IMyWCFService>("BasicHttpBinding_IMyWCFService"); IMyWCFService proxy = factory.CreateChannel(); MessageBox.Show(proxy.Echo("Hello!")); }
-
修改 app.config 文件以包含 WCF 配置:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" /> </startup> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IMyWCFService" /> </basicHttpBinding> </bindings> <client> <endpoint address="http://localhost:8733/Design_Time_Addresses/ServiceLayer/MyWCFService/" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyWCFService" contract="ServiceLayer.IMyWCFService" name="BasicHttpBinding_IMyWCFService" /> </client> </system.serviceModel> </configuration>
-
确保
endpoint address
的 app.config 中的UILayer
与baseAddress
的 app.config 中的ServiceLayer
相同。
设置项目
- 创建一个安装项目。
- 右键单击项目,然后从“添加”菜单中选择“项目输出”。然后添加 ServiceLayer 的主要输出。 (从下拉菜单中选择项目)
- 右键单击项目,然后从“添加”菜单中选择“项目输出”。然后添加 UILayer 的主要输出。
- 右键单击设置项目并选择查看自定义操作。
- 在自定义操作窗口中,对于所有节点(安装、提交、回滚、卸载),右键单击并选择添加自定义操作,然后从应用程序文件夹中选择 ServiceLayer 的主要输出。
- 右键单击安装项目并选择查看文件系统。
- 右键单击根节点并选择添加特殊文件夹并选择用户的启动文件夹。
- 选择启动文件夹,然后在右侧窗格中,右键单击并选择创建快捷方式,然后从应用程序文件夹中选择 UILayer 的主要输出。
- 重新构建解决方案并设置项目。
- 通过转到安装程序的输出文件夹或右键单击安装程序项目并选择安装来安装安装程序。
安装完成后,可能需要重启系统看看效果。服务会自动启动,用户登录后会显示UILayer。
点击按钮,它会显示一个消息框说你好!此内容来自服务。