Создайте установщик службы Windows, используя. NET Core и командную строку. - PullRequest
0 голосов
/ 13 июля 2020

Я создал приложение службы ASP. NET Core Windows, используя этот пример: https://github.com/dotnet/AspNetCore.Docs/tree/master/aspnetcore/host-and-deploy/windows-service/samples/2.x/AspNetCoreService

Теперь я хочу установить свою службу с помощью командной строки, например "MyService.exe -install". Я знаю, что если я использую «s c create», это будет работать, но я хочу установить его, используя собственное приложение, чтобы установить и настроить службу по своему усмотрению.

Я нашел образец с использованием пакета Toshelf, но Я использую WebHostBuilder и пытаюсь использовать конфигурацию Custom Service. Служба устанавливается, но при запуске не работает.

Я использую. NET Core 2.2.

Моя конфигурация:

HostFactory.Run(x =>
            {
                x.Service<CustomWebHostService>(sc =>
                {
                    sc.ConstructUsing(() => new CustomWebHostService(host));

                    // the start and stop methods for the service
                    sc.WhenStarted(ServiceBase.Run);
                    sc.WhenStopped(s => s.Stop());
                });

                x.RunAsLocalSystem();
                x.StartAutomatically();

                x.SetServiceName("Teste Core");
                x.SetDisplayName("Teste ASP.NET Core Service");
                x.SetDescription("Teste ASP.NET Core as Windows Service.");
            });

Моя полная исходный код: https://github.com/rkiguti/dotnetcore.windows-service

1 Ответ

0 голосов
/ 17 июля 2020

Я изменил свой код как другой образец, и теперь мои службы работают как консольное приложение и как windows службы. И его можно установить с помощью командной строки «MyService.exe install».

Мой файл program.cs:

class Program
{
    public static void Main(string[] args)
    {
        HostFactory.Run(x =>
        {
            x.Service<ApplicationHost>(sc =>
            {
                sc.ConstructUsing(() => new ApplicationHost());

                // the start and stop methods for the service
                sc.WhenStarted((svc, control) =>
                {
                    svc.Start(control is ConsoleRunHost, args);
                    return true;
                });
                sc.WhenStopped(s => s.Stop());
                sc.WhenShutdown(s => s.Stop());
            });

            x.UseNLog();
            x.RunAsLocalSystem();
            x.StartAutomatically();

            x.SetServiceName("Test Core");
            x.SetDisplayName("Test ASP.NET Core Service");
            x.SetDescription("Test ASP.NET Core as Windows Service.");
        });
    }
}

Мой файл ApplicationHost.cs:

public class ApplicationHost
{
    private IWebHost _webHost;

    public void Start(bool launchedFromConsole, string[] args)
    {
        if (!launchedFromConsole)
        {
            var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
            var pathToContentRoot = Path.GetDirectoryName(pathToExe);
            Directory.SetCurrentDirectory(pathToContentRoot);
        }

        IWebHostBuilder webHostBuilder = CreateWebHostBuilder(args);
        _webHost = webHostBuilder.Build();

        _webHost.Start();

        // print information to console
        if (launchedFromConsole)
        {
            var serverAddresses = _webHost.ServerFeatures.Get<IServerAddressesFeature>()?.Addresses;
            foreach (var address in serverAddresses ?? Array.Empty<string>())
            {
                Console.WriteLine($"Listening on: {address}");
                Console.WriteLine("Press Ctrl+C to end the application.");
            }
        }
    }

    public void Stop()
    {
        _webHost?.Dispose();
    }

    private IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureLogging((hostingContext, logging) =>
            {
                logging.AddEventLog();
            })
            .ConfigureAppConfiguration((context, config) =>
            {
                // Configure the app here.
            })
            .UseUrls("http://+:8000")
            .UseStartup<Startup>();
}

Полный исходный код: https://github.com/rkiguti/dotnetcore.windows-service

...