【问题标题】:Unable to start service written in .NET 2.0 on Windows XP Embedded无法在 Windows XP Embedded 上启动用 .NET 2.0 编写的服务
【发布时间】:2010-03-09 22:28:53
【问题描述】:

我创建了一个小型可执行文件,它可以通过调用MyApp.exe 作为普通应用程序启动,也可以通过调用MyApp.exe -s 作为服务启动。因为我试图保持尽可能简单,所以我通过手动运行“安装”这个应用程序

sc create MyAppService binPath= "C:\MyApp\MyApp.exe -s"

然后我像往常一样使用net start MyAppService 启动服务。

在两台 Windows XP 机器和两台 Windows 2000 机器上,这可以正常工作。但是,在两台不同的 Windows XP Embedded 机器上,当我尝试启动服务时,我收到以下消息:

发生系统错误 1083。

配置此服务运行的可执行程序未实现该服务。

在一台机器上,我可以通过卸载并重新安装 .NET 2.0 来解决这个问题,但在第二台机器上这不起作用。

我不知道如何去调试这个,而且搜索谷歌似乎只找到了失败的特定服务,例如 BITS 和 Exchange 服务。

下面是类MyApp,它是启动类,和MyAppService,它是扩展ServiceBase的类。提前感谢您对此的任何指导。

MyApp.cs

static class MyApp
{
    [STAThread] static void Main( string[] args )
    {
        ....
        switch ( arg1 )
        {
            case "-s":
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] { new MyAppService() };
                ServiceBase.Run( ServicesToRun );
                break;
             ....
        }
    }
}

MyAppService.cs:

class MyAppService : ServiceBase
{
    static MyAppService()
    {
        // ...
    }

    protected override void OnStart( string[] args )
    {
        // ...
    }
}

【问题讨论】:

  • 您使用的是 .NET 框架还是 .NET Compact Framework?它们是不同的。此外,除了 .NET Framework(包括 Windows 系统文件)之外,您的服务是否有任何依赖项? XPE 是高度划分的。不同的构建在内容上可能会有很大差异。
  • 我使用的是普通的 .NET Framework。除了 .NET 2.0 本身之外,我知道的唯一依赖项是我在某个时候 P/Invoke SetComputerNameEx,但在服务启动期间不会触及该代码路径。我不确定如何证明我在服务启动期间是否有任何依赖关系。
  • 两者的 Windows XP Embedded 版本是否相同?
  • 它们不是,但我不知道其中任何一个是如何构建的。我对 XPe 不是很熟悉,我希望我必须确保在 XPe 安装中有一些特定的东西。
  • 如果你能弄清楚你缺少什么,你也许可以将文件从一个系统复制到另一个系统(假设它们是相同的硬件架构)。此外,有了这些信息,进行 XPE 构建的人应该能够确定系统上需要哪些组件。如果可以,请对每个 XPE 系统上的 system32 文件夹进行比较。该列表可能足够小,足以让您开始。

标签: c# .net windows-services .net-2.0


【解决方案1】:

在桌面上,如果服务未在 Windows 注册表中正确注册 svchost 实例应该在其下运行的帐户下,则可能会发生这种情况。我没有 XPe 经验,但请尝试查看 HKLM\Software\Microsoft\Windows NT\CurrentVersion\Svchost 并确保该帐户的 MyAppService 正确列出。

【讨论】:

    【解决方案2】:
    1. 如果有包括安全日志在内的有用信息,请尝试检查事件日志。
    2. 似乎没有将 MyAppService 识别为服务,或者 MyApp.exe 没有向 XPe 公开任何服务。专注于这件事以获得根本原因。
    3. 为了快速测试,您可以使用 VMWare 在您的开发 PC 中运行 XPe。 VMWare 有办法将当前运行的 XPe 复制到镜像中并复制到您的 PC,但不确定它是否可以正常工作。

    【讨论】:

      【解决方案3】:

      看来我也有同样的问题。 ServiceController.Start() 未成功启动服务。该应用程序使用 C# .NET2 并在 Window XPe 中运行。解决方法如下:

      TimeSpan timeout = TimeSpan.FromMilliseconds(20000);
      while (true)
      {
          ServiceController service = new ServiceController("myservice");
          service.MachineName = ".";
          try 
          {
             service.Start()
             service.WaitForStatus(ServiceControllerStatus.Running, timeout);
          }
          catch
          {  
              service.Stop();
              continue;
          }
       }
      

      在循环2到3次后,服务通常可以成功启动。 但是30-40秒过去了。这是不可接受的。
      有没有人在这个问题上经历过?谢谢!

      【讨论】:

      • 我猜你依赖于另一个稍后启动的服务。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2010-12-03
      • 2013-06-30
      相关资源
      最近更新 更多