【问题标题】:FileNotFoundException when running a Windows Service运行 Windows 服务时出现 FileNotFoundException
【发布时间】:2017-10-10 19:58:52
【问题描述】:

我在 Visual Studio 中有一个生成可执行文件的项目。我已经从该可执行文件创建了一个 Windows 服务。每当我运行它时,它都会失败并出现以下错误:

错误 1053:服务没有响应启动或控制 及时提出要求。

查看 Windows 事件查看器后,我发现我收到了位于项目工作目录中的 FileNotFoundException。这是打开文件的部分:

using (StreamReader file = File.OpenText("configSet.json"))
{
    JsonSerializer serializer = new JsonSerializer();
    configSet = (ConfigSet)serializer.Deserialize(file, typeof(ConfigSet));
}

每当我在 Visual Studio 中或从命令提示符处运行该服务时,它都能正常工作。由于某种原因,当我尝试将其作为 Windows 服务启动时,这不起作用。

我还发现,在将文件作为 Windows 服务启动时,硬编码文件路径可以正常工作。
我想避免这种情况并尽可能使用相对路径(因此我不必执行代码检查来确定我是从 Visual Studio、命令提示符还是作为 Windows 服务运行服务)。

【问题讨论】:

  • 你的 json 文件在哪里?
  • @S.Petrosov 在我生成的项目文件夹的根文件夹中。基本上,我在 Visual Studio 中有一个项目。我将它发布到我的桌面,这会生成一个包含所需 dll、文件夹等的文件夹。该文件夹包含我创建服务的可执行文件。它还包含 json 文件。我将整个文件夹移至 Program Files。之后,我通过以下方式创建服务: sc.exe create MY.SERVICE binpath= "C:\Program Files\myService\myService.exe
  • 文件很可能不在正确的路径中。服务从不同于可执行文件所在的目录运行。 stackoverflow.com/questions/884963/…

标签: c# service directory windows-services


【解决方案1】:

您可以使用反射获取可执行文件的路径并将当前目录设置为它。以下是如何做到这一点的示例:

String path = System.Reflection.Assembly.GetExecutingAssembly().Location;
path = System.IO.Path.GetDirectoryName(path);
Directory.SetCurrentDirectory(path);

【讨论】:

    猜你喜欢
    • 2019-10-19
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2017-06-05
    • 2017-03-26
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多