草庐IT

c# - Windows 服务 (c#) 未启动

coder 2024-06-14 原文

抱歉我的英语不好,我不是母语人士。

我正在尝试制作 Windows 服务。如果我尝试构建、安装和运行 VS 模板,我不会收到任何错误。

我已将我的 winform 应用程序移植到服务中,创建了一个安装程序,添加了一些数据源,添加了对 web 服务的引用,添加了一些类,但没有向 OnStart() 和 OnStop() 添加任何代码。我的代码构建正确,我可以从服务管理器启动和停止服务。

但是,如果我向服务类添加一些代码(我不会在任何地方调用它),并且如果我不向 OnStart() 和 OnStop() 添加代码,那么我将无法启动该服务,并且错误类似于“服务不响应控制功能”。在事件日志中我可以看到异常:

  System.ArgumentOutOfRangeException
Stack:
 in System.String.InternalSubStringWithChecks(Int32, Int32, Boolean)
 in System.String.Substring(Int32, Int32)
 in UpdaterFIAS.FIASMainClass.getNameFile(System.String, System.String, System.String)
 in UpdaterFIAS.FIASMainClass..ctor()
 in UpdaterFIAS.Updater..ctor()
 in UpdaterFIAS.Program.Main()

我可以在这里看到我的函数 getNameFile() 正在抛出异常。然而,这并没有在我的代码中调用,因为我有空的 OnStart()。那么,如果事件日志没有写入任何内容(如果它在 OnStart() 中),我如何才能找到问题所在?而且我无法将调试器附加到它,因为它会引发此异常。

编辑:忘了说,当我使用 Windows 窗体时,我的代码可以正常工作,但在这里我没有在 OnStart 中调用任何东西,项目构建没有错误,但在启动服务时出现异常。

编辑 2: Program.cs代码:

namespace UpdaterFIAS
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new Updater() 
            };
            ServiceBase.Run(ServicesToRun);
        }
    }
}

Updater.cs代码:

namespace UpdaterFIAS
{
    public partial class Updater : ServiceBase
    {
        public Updater()
        {
            InitializeComponent();
            if (!System.Diagnostics.EventLog.SourceExists("MySource"))
            {
                System.Diagnostics.EventLog.CreateEventSource("MySource", "MyNewLog");
            }
            eventLog1.Source = "MySource";
            eventLog1.Log = "MyNewLog";
        }

        FIASMainClass mainFIAS = new FIASMainClass();

        protected override void OnStart(string[] args)
        {
            //timer1 = new System.Timers.Timer(5000);
            //timer1.Elapsed += timer1_Elapsed;
            //timer1.AutoReset = false;
            //timer1.Enabled = true;

            //ServiceStarterThread = new Thread(ServiceStarter);
            //ServiceStarterThread.Start();

            eventLog1.WriteEntry("In OnStart");
            //mainFIAS.Start();
        }

        protected override void OnStop()
        {
            //if (updater != null && (updater.ThreadState != System.Threading.ThreadState.Aborted && updater.ThreadState != System.Threading.ThreadState.Stopped)) updater.Abort();
            //if (log != null && (log.ThreadState != System.Threading.ThreadState.Aborted && log.ThreadState != System.Threading.ThreadState.Stopped)) log.Abort();

            //log.Abort();
            //timer1.Enabled = false;
            //timer1.Dispose();

            eventLog1.WriteEntry("In OnStop");
            //mainFIAS.Stop();
        }
    }
}

编辑 3: FIASMainClass.cs代码:

        namespace UpdaterFIAS
        {
            class FIASMainClass
            {
                public FIASMainClass()
                { }

                public void Start()
                {
                    ServiceStarterThread = new Thread(ServiceStarter);
                    ServiceStarterThread.Start();
                }

                public void Stop()
                {
                    if (updater != null && (updater.ThreadState != System.Threading.ThreadState.Aborted && updater.ThreadState != System.Threading.ThreadState.Stopped)) updater.Abort();
                    if (log != null && (log.ThreadState != System.Threading.ThreadState.Aborted && log.ThreadState != System.Threading.ThreadState.Stopped)) log.Abort();
                }

                private void ServiceStarter()
                {
                ...
                }
    ...
    ...
    ...
    }
}

最佳答案

在 Stack Trace 中,入口点是 Program.Main。从那里创建一个新的 Updater 并调用 getNameFiles。这将是开始的地方。

至于调试 Windows 服务。你说得对,这确实很难。我知道有两个技巧。第一个是在 Main(或 OnStart)中设置一个 Thread.Sleep,然后再做任何事情。这样您就有时间附加调试器。

另一个技巧是,如果您的 Visual Studio 与您的服务位于同一台机器上,则在 Main(或 OnStart)中添加以下行:Debugger .启动()。这将告诉服务寻找 Visual Studio 进行调试 session 。更多信息请看这里:Debugger.Launch() on windows service in Windows 8

关于c# - Windows 服务 (c#) 未启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24735887/

有关c# - Windows 服务 (c#) 未启动的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  4. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  5. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  6. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  7. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  8. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  9. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  10. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

随机推荐