After Publisihing Worker Service as Windows Service it keeps failing with the error: System.NullReferenceException

After Publisihing Worker Service as Windows Service it keeps failing with the error: System.NullReferenceException

worker 服务是 .net core 3.1,当我在 VS 2019(调试和发布)上 运行 它时它工作,但在 deploying/publishing 并使用 [=10= 安装它之后], 它一直失败并显示错误 Object reference not set to an instance of an object.

我已经检查过了,我觉得唯一的一点是原因,可能来自 DI(不应该是,因为它 运行 在 VS 2019 上非常完美),还有 appsettings.jsonappsettings.Development.json 包含在发布的文件中(所以我看不出 IOptionsMonitorIServiceScopeFactory 应该失败的原因)

默认情况下,在将辅助服务安装为 windows 服务后,它会将所需的文件复制到 运行 一个 TEMP 文件夹,如果您使用 sc 安装默认值 (LocalSystem),具有文件夹模式 C:\WINDOWS\TEMP\.net\<executable-name>\<random-hash>\.

appsetings.json 或任何设置文件将不会复制到那里(参见 microsoft doc)。

因此需要将 IHostBuilderIConfigurationBuilder 指向设置文件所在的位置(更有可能指向发布可执行文件的位置)。

我用下面的代码解决了这个问题(通过设置 IConfigurationBuilder 的基本路径):

public static IHostBuilder CreateHostBuilder(string[] args)
{            
    return Host.CreateDefaultBuilder(args)
        .UseWindowsService()
        .ConfigureAppConfiguration((hostContext, config) => {
            
            // Ensure that the appsettings.json files are in same folder with the executable   
            string pathToExe = Process.GetCurrentProcess().MainModule.FileName;
            string dir = Path.GetDirectoryName(pathToExe);
            config.SetBasePath(dir);

        })
        .ConfigureServices((hostContext, services) =>
        {
            services.AddHostedService<Worker>();
        });
}

如需进一步参考,请参阅以下 GitHub 个问题 here and here