问题  通过单击按钮创建带有ServiceInstaller的WindowsForm应用需要帮助

wolk_tambowskij

新成员
已加入
2015年9月25日
留言内容
4
编程经验
Beginner
您好,编码专家!

我是使用Visual Studio进行编程的新手,而一般而言,编程...
我需要有关如何使以下方案工作的建议。

我有的:
Visual C#2008专业版
使用它创建的WindowsForm应用程序(MyApp)来存储一些信息
外部控制台应用程序(AnyApp.exe)

MyApp的设计包含:
5个文本框,3个复选框和一个SubmitButton:
TextBox 4有一个密码提示,TextBox5的Enable.State由CheckBox1控制(默认情况下,如果Checked = Enable.True,Unchecked = Enable.False)

我要实现的目标:
关于推动SubmitButton MyApp
1.应该安装一个服务,该服务应从AnyApp.exe开始,其命令行参数包含诸如'\%PROGRAMFILES%\ PathTo_AnyApp.exe之类的格式的用户信息-[某些静态参数1] [email protected],TextBox4.Text-[某些静态参数2] TextBox1.Text:TextBox2.Text-[某些静态参数3]',依此类推;
1.a)选中CheckBox1时,命令行参数还应包含“-[某些静态参数4] TextBox5.Text”,否则不包含TextBox5.Text或静态参数4;
1.B)当CheckBox2检查“ - [一些静态参数3]”应该从服务启动选项被移除;
2.选中CheckBox3(默认情况下选中)时,应将一些注册表项导入系统注册表;
3.如果某些必填字段为空,则应弹出警告消息,其中包含提交和取消的可能性;
4. MyApp应该退出

非常感谢您的任何建议!
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
您不清楚要什么。您是说要安装将运行控制台应用程序的服务,还是要将控制台应用程序安装为服务?老实说,两者都没有道理。该服务和/或控制台应用程序实际上应该实现什么?
 

wolk_tambowskij

新成员
已加入
2015年9月25日
留言内容
4
编程经验
Beginner
亲爱的 金西尼, 谢谢您的回复。
理想情况下,我想将控制台应用程序作为服务安装-我不需要第二步。控制台应用程序是一个简单的SIP客户端,应该使用MyApp中用户输入定义的凭据和选项在SIP服务器上注册,并且应在后台运行,以便后端可以通过其连接发送和接收语音数据。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
您不能仅将任何旧的控制台应用程序安装为Windows服务。实际上,必须将其编写为Windows服务。我编写了一些可以作为控制台应用程序运行的项目,以简化调试(调试之前必须先安装服务),然后再将其安装为Windows服务。我首先创建一个Windows Service项目,该项目将自动添加一个继承System.ServiceProcess.ServiceBase的类。然后,服务执行的任务的代码将放入OnStart方法中。然后,我修改Program类中的Main方法,以检测仅在调试时使用的特定命令行参数,如果检测到则作为控制台应用程序运行,否则作为Windows服务运行。作为控制台应用程序运行意味着基本上运行与派生服务类的OnStart方法中相同的代码。这是此类服务类的示例:
using System;
using System.IO;
using System.ServiceProcess;
using ApplicationLogger = SI.Moh.Phisco_Periph.Global.ApplicationLogger;

namespace SI.Moh.Phisco.Submissions.Service
{
    public partial class SubmissionService : ServiceBase
    {
        private const string ERROR_LOG_NAME = "PhiscoErrorLog";
        private const string INFO_LOG_NAME = "PhiscoInfoLog";

        private SubmissionProcessor processor;

        public SubmissionService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            try
            {
                processor = new SubmissionProcessor();

                var path = Properties.Settings.Default.SubmissionsRootFolder;
                var filter = Properties.Settings.Default.SubmissionFileNamePattern;

#if DEBUG
                ApplicationLogger.Inst.LogInfo(INFO_LOG_NAME, "Path: " + path);
                ApplicationLogger.Inst.LogInfo(INFO_LOG_NAME, "Filter: " + filter);
#endif

                // Process files already in the submission folder.
                foreach (var file in new DirectoryInfo(path).GetFiles(filter))
                {
                    processor.EnqueueFile(file.FullName);
                }

                processor.ProcessQueuedFilesAsync();

                // Watch for new files in the submission folder.
                submissionFolderWatcher.Path = path;
                submissionFolderWatcher.Filter = filter;
                submissionFolderWatcher.EnableRaisingEvents = true;
            }
            catch (Exception ex)
            {
                ApplicationLogger.Inst.LogException(ERROR_LOG_NAME, ex.Message, ex);
            }
        }

        protected override void OnStop()
        {
        }

        private void submissionFolderWatcher_Renamed(object sender, RenamedEventArgs e)
        {
            ApplicationLogger.Inst.LogInfo(INFO_LOG_NAME, "File detected: " + e.FullPath);

            processor.EnqueueFile(e.FullPath);
            processor.ProcessQueuedFilesAsync();
        }
    }
}
这是对应的Program类:
using System.IO;
using System.Linq;
using System.ServiceProcess;
using NSWHealth.DX.Common.Web;
using SI.Moh.Phisco_Periph.Dto.Mapping;

namespace SI.Moh.Phisco.Submissions.Service
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main(string[] args)
        {
            DomainMapper.MapDomain();

            if (args.Length == 1 && args[0] == "/console")
            {
                // Run the application as a Console app.
                using (var processor = new SubmissionProcessor())
                {
                    var folder = new DirectoryInfo(Properties.Settings.Default.SubmissionsRootFolder);

                    foreach (var file in folder.GetFiles(Properties.Settings.Default.SubmissionFileNamePattern).OrderBy(fi => fi.CreationTime))
                    {
                        processor.EnqueueFile(file.FullName);
                    }

                    processor.ProcessQueuedFiles();
                }
            }
            else
            {
                // Run the application as a Windows service.
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[]
                                    {
                                        new SubmissionService()
                                    };
                ServiceBase.Run(ServicesToRun);
            }
        }
    }
}
至于使用命令行参数进行安装,我认为使用标准功能是不可能的。我做了一些搜索,虽然还没有阅读,但我认为这可能会有所帮助:

按照您想要的方式安装Windows服务! -CodeProject
 

wolk_tambowskij

新成员
已加入
2015年9月25日
留言内容
4
编程经验
Beginner
亲爱的朋友,
谢谢你的解释。
如我所想,我可以通过OnStart或OnBeforeStart方法定义参数...
但是我不明白的是,我如何让MyApp使用表单中的输入来创建参数并将其提交给AmyApp。
另外,由于我是编程新手,所以我仅部分理解了示例的逻辑以及如何在我的项目中使用代码:例如。如果我了解您正在创建错误记录器,并且看到在何处指定将由该服务创建的日志文件的路径,但我不知道在何处将应用作AnyApp.exe的路径就我而言的服务...
代码项目中的文章很有帮助,但我认为这对我来说很难-我想保持简单,并可能使用C#...
如果您觉得不太困难,可以请您向我解释您的服务逻辑,例如为假人和完整的初学者服务吗?
如果您没有时间,我会明白的,但是有时候,当您得到一位知道您的问题的老师的辅导时,它真的很有帮助...我已经通过不同的论坛进行了研究,并尝试阅读一些通用的教材,但是我更加困惑...我更"learning by doing"家伙-成功创建表格后,我需要一步一步的指导...
 

wolk_tambowskij

新成员
已加入
2015年9月25日
留言内容
4
编程经验
Beginner
亲爱的约翰,
当我以这种方式正确使用时,只能使用MyApp使用给定的参数启动该服务,但是我需要从MyApp向该参数注册一次该服务,以便在安装后使用该参数在每次启动时自动启动该服务。
 

狂暴风暴

知名会员
已加入
2014年8月6日
留言内容
85
地点
南非鲁德普特
编程经验
10+
您是否考虑过将参数放置在配置文件中。服务启动时,它可以读取文件并以这种方式获取“参数”。无需通过。如果要使用其他参数,请修改配置文件(我想这将是MyApp.exe的功能),然后重新启动服务(我认为也可以从MyApp.exe进行此操作,但从未尝试过)。
 
最佳 底部