Aracılığıyla paylaş


Kullanarak Windows Hizmeti oluşturma BackgroundService

.NET Framework geliştiricileri büyük olasılıkla Windows Hizmeti uygulamaları hakkında bilgi sahibidir. .NET Core ve .NET 5+'den önce. .NET Framework kullanan geliştiriciler, arka plan görevlerini gerçekleştirmek veya uzun süre çalışan işlemleri yürütmek için Windows Hizmetleri oluşturabilirdi. Bu işlev hala kullanılabilir durumdadır ve Windows Hizmeti olarak çalışan Çalışan Hizmetleri oluşturabilirsiniz.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Bir .NET çalışan uygulamasını tek bir dosya yürütülebilir dosyası olarak yayımlayın.
  • Bir Windows Hizmeti oluşturun.
  • BackgroundService Uygulamayı Windows Hizmeti olarak oluşturun.
  • Windows Hizmeti'ni başlatın ve durdurun.
  • Olay günlüklerini görüntüleyin.
  • Windows Hizmeti'ni silin.

Bahşiş

".NET'te Çalışanlar" örnek kaynak kodunun tümü, indirilebilmeniz için Samples Browser'da bulunur. Daha fazla bilgi için bkz . Kod örneklerine göz atma: .NET'te çalışanlar.

Önemli

.NET SDK'sını yüklemek ve çalışan şablonunu da yükler Microsoft.NET.Sdk.Worker . Başka bir deyişle, .NET SDK'sını yükledikten sonra dotnet new worker komutunu kullanarak yeni bir çalışan oluşturabilirsiniz. Visual Studio kullanıyorsanız, isteğe bağlı ASP.NET ve web geliştirme iş yükü yüklenene kadar şablon gizlenir.

Önkoşullar

Yeni proje oluşturma

Visual Studio ile yeni bir Çalışan Hizmeti projesi oluşturmak için Dosya>Yeni>Proje... seçeneğini belirlemeniz gerekir. Yeni proje oluştur iletişim kutusunda "Çalışan Hizmeti" araması yapın ve Çalışan Hizmeti şablonu'na tıklayın. .NET CLI kullanmayı tercih ediyorsanız, sık kullandığınız terminali çalışma dizininde açın. dotnet new komutunu çalıştırın ve öğesini istediğiniz proje adıyla değiştirin<Project.Name>.

dotnet new worker --name <Project.Name>

.NET CLI yeni çalışan hizmeti projesi komutu hakkında daha fazla bilgi için bkz . dotnet new worker.

Bahşiş

Visual Studio Code kullanıyorsanız tümleşik terminalden .NET CLI komutlarını çalıştırabilirsiniz. Daha fazla bilgi için bkz . Visual Studio Code: Tümleşik Terminal.

NuGet paketini yükleme

.NET IHostedService uygulamalarından yerel Windows Hizmetleri ile birlikte çalışmanız için NuGet paketini yüklemeniz Microsoft.Extensions.Hosting.WindowsServices gerekir.

Bunu Visual Studio'dan yüklemek için NuGet Paketlerini Yönet... iletişim kutusunu kullanın. "Microsoft.Extensions.Hosting.WindowsServices" için arama yapın ve yükleyin. .NET CLI kullanmayı tercih ediyorsanız komutunu çalıştırın dotnet add package :

dotnet add package Microsoft.Extensions.Hosting.WindowsServices

.NET CLI paket ekle komutu hakkında daha fazla bilgi için bkz . dotnet add package.

Paketleri başarıyla ekledikten sonra proje dosyanız artık aşağıdaki paket başvurularını içermelidir:

<ItemGroup>
  <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
  <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
</ItemGroup>

Proje dosyasını güncelleştirme

Bu çalışan projesi C# öğesinin null atanabilir başvuru türlerini kullanır. Bunları projenin tamamında etkinleştirmek için proje dosyasını uygun şekilde güncelleştirin:

<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>net8.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>true</ImplicitUsings>
    <RootNamespace>App.WindowsService</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
    <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
  </ItemGroup>
</Project>

Yukarıdaki proje dosyası değişiklikleri düğümü ekler <Nullable>enable<Nullable> . Daha fazla bilgi için bkz . Null atanabilir bağlamı ayarlama.

Hizmeti oluşturma

Projeye JokeService.cs adlı yeni bir sınıf ekleyin ve içeriğini aşağıdaki C# koduyla değiştirin:

namespace App.WindowsService;

public sealed class JokeService
{
    public string GetJoke()
    {
        Joke joke = _jokes.ElementAt(
            Random.Shared.Next(_jokes.Count));

        return $"{joke.Setup}{Environment.NewLine}{joke.Punchline}";
    }

    // Programming jokes borrowed from:
    // https://github.com/eklavyadev/karljoke/blob/main/source/jokes.json
    private readonly HashSet<Joke> _jokes = new()
    {
        new Joke("What's the best thing about a Boolean?", "Even if you're wrong, you're only off by a bit."),
        new Joke("What's the object-oriented way to become wealthy?", "Inheritance"),
        new Joke("Why did the programmer quit their job?", "Because they didn't get arrays."),
        new Joke("Why do programmers always mix up Halloween and Christmas?", "Because Oct 31 == Dec 25"),
        new Joke("How many programmers does it take to change a lightbulb?", "None that's a hardware problem"),
        new Joke("If you put a million monkeys at a million keyboards, one of them will eventually write a Java program", "the rest of them will write Perl"),
        new Joke("['hip', 'hip']", "(hip hip array)"),
        new Joke("To understand what recursion is...", "You must first understand what recursion is"),
        new Joke("There are 10 types of people in this world...", "Those who understand binary and those who don't"),
        new Joke("Which song would an exception sing?", "Can't catch me - Avicii"),
        new Joke("Why do Java programmers wear glasses?", "Because they don't C#"),
        new Joke("How do you check if a webpage is HTML5?", "Try it out on Internet Explorer"),
        new Joke("A user interface is like a joke.", "If you have to explain it then it is not that good."),
        new Joke("I was gonna tell you a joke about UDP...", "...but you might not get it."),
        new Joke("The punchline often arrives before the set-up.", "Do you know the problem with UDP jokes?"),
        new Joke("Why do C# and Java developers keep breaking their keyboards?", "Because they use a strongly typed language."),
        new Joke("Knock-knock.", "A race condition. Who is there?"),
        new Joke("What's the best part about TCP jokes?", "I get to keep telling them until you get them."),
        new Joke("A programmer puts two glasses on their bedside table before going to sleep.", "A full one, in case they gets thirsty, and an empty one, in case they don’t."),
        new Joke("There are 10 kinds of people in this world.", "Those who understand binary, those who don't, and those who weren't expecting a base 3 joke."),
        new Joke("What did the router say to the doctor?", "It hurts when IP."),
        new Joke("An IPv6 packet is walking out of the house.", "He goes nowhere."),
        new Joke("3 SQL statements walk into a NoSQL bar. Soon, they walk out", "They couldn't find a table.")
    };
}

readonly record struct Joke(string Setup, string Punchline);

Yukarıdaki şaka hizmeti kaynak kodu tek bir işlev parçası olan GetJoke yöntemini kullanıma sunar. Bu, rastgele bir string programlama şakası temsil eden geri dönen bir yöntemdir. Sınıf kapsamlı _jokes alanı, şaka listesini depolamak için kullanılır. Listeden rastgele bir şaka seçilir ve döndürülür.

Sınıfı yeniden yazma Worker

Şablondaki var olanı Worker aşağıdaki C# koduyla değiştirin ve dosyayı WindowsBackgroundService.cs olarak yeniden adlandırın:

namespace App.WindowsService;

public sealed class WindowsBackgroundService(
    JokeService jokeService,
    ILogger<WindowsBackgroundService> logger) : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        try
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                string joke = jokeService.GetJoke();
                logger.LogWarning("{Joke}", joke);

                await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
            }
        }
        catch (OperationCanceledException)
        {
            // When the stopping token is canceled, for example, a call made from services.msc,
            // we shouldn't exit with a non-zero exit code. In other words, this is expected...
        }
        catch (Exception ex)
        {
            logger.LogError(ex, "{Message}", ex.Message);

            // Terminates this process and returns an exit code to the operating system.
            // This is required to avoid the 'BackgroundServiceExceptionBehavior', which
            // performs one of two scenarios:
            // 1. When set to "Ignore": will do nothing at all, errors cause zombie services.
            // 2. When set to "StopHost": will cleanly stop the host, and log errors.
            //
            // In order for the Windows Service Management system to leverage configured
            // recovery options, we need to terminate the process with a non-zero exit code.
            Environment.Exit(1);
        }
    }
}

Yukarıdaki kodda, JokeService ile birlikte ILoggereklenir. Her ikisi de sınıfın kullanımına alan olarak private readonly sunulur. yönteminde ExecuteAsync , şaka hizmeti bir şaka isteğinde bulunur ve bunu günlükçüye yazar. Bu durumda, günlükçü Windows Olay Günlüğü - Microsoft.Extensions.Logging.EventLog.EventLogLoggertarafından uygulanır. Günlükler için yazılır ve Olay Görüntüleyicisi görüntülemek için kullanılabilir.

Dekont

Varsayılan olarak, Olay Günlüğü önem derecesi şeklindedir Warning. Bu yapılandırılabilir, ancak tanıtım amacıyla uzantı yöntemiyle LogWarning günlüklerWindowsBackgroundService. Düzeyi özellikle hedeflemek EventLog için uygulama ayarlarına bir girdi ekleyin.{ Environment}.json veya bir EventLogSettings.Filter değer sağlayın.

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    },
    "EventLog": {
      "SourceName": "The Joke Service",
      "LogName": "Application",
      "LogLevel": {
        "Microsoft": "Information",
        "Microsoft.Hosting.Lifetime": "Information"
      }
    }
  }
}

Günlük düzeylerini yapılandırma hakkında daha fazla bilgi için bkz . .NET'te günlüğe kaydetme sağlayıcıları: Windows EventLog'ı yapılandırma.

Sınıfı yeniden yazma Program

Program.cs dosya içeriğini aşağıdaki C# koduyla değiştirin:

using App.WindowsService;
using Microsoft.Extensions.Logging.Configuration;
using Microsoft.Extensions.Logging.EventLog;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddWindowsService(options =>
{
    options.ServiceName = ".NET Joke Service";
});

LoggerProviderOptions.RegisterProviderOptions<
    EventLogSettings, EventLogLoggerProvider>(builder.Services);

builder.Services.AddSingleton<JokeService>();
builder.Services.AddHostedService<WindowsBackgroundService>();

IHost host = builder.Build();
host.Run();

AddWindowsService uzantı yöntemi, uygulamayı Windows Hizmeti olarak çalışacak şekilde yapılandırıyor. Hizmet adı olarak ".NET Joke Service"ayarlanır. Barındırılan hizmet bağımlılık ekleme için kaydedilir.

Hizmetleri kaydetme hakkında daha fazla bilgi için bkz . .NET'te bağımlılık ekleme.

Uygulamayı yayımlayın

.NET Çalışan Hizmeti uygulamasını bir Windows Hizmeti olarak oluşturmak için, uygulamayı tek bir dosya yürütülebilir dosyası olarak yayımlamanız önerilir. Dosya sisteminde bağımlı dosyalar olmadığından, kendi içinde yürütülebilir dosya olması daha az hataya açıktır. Ancak, Windows Hizmet Denetim Yöneticisi tarafından hedeflenebilen bir *.exe dosyası oluşturduğunuz sürece, tamamen kabul edilebilir olan farklı bir yayımlama kalıcılığı seçebilirsiniz.

Önemli

Alternatif bir yayımlama yaklaşımı *.dll 'yi (*.exe yerine) oluşturmaktır ve Yayımlanan uygulamayı Windows Hizmet Denetim Yöneticisi'ni kullanarak yüklediğinizde .NET CLI'sini temsilci olarak verir ve DLL'yi geçirirsiniz. Daha fazla bilgi için bkz . .NET CLI: dotnet komutu.

sc.exe create ".NET Joke Service" binpath="C:\Path\To\dotnet.exe C:\Path\To\App.WindowsService.dll"
<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>net8.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>true</ImplicitUsings>
    <RootNamespace>App.WindowsService</RootNamespace>
    <OutputType>exe</OutputType>
    <PublishSingleFile Condition="'$(Configuration)' == 'Release'">true</PublishSingleFile>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <PlatformTarget>x64</PlatformTarget>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
    <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
  </ItemGroup>
</Project>

Proje dosyasının vurgulanan önceki satırları aşağıdaki davranışları tanımlar:

  • <OutputType>exe</OutputType>: Bir konsol uygulaması oluşturur.
  • <PublishSingleFile Condition="'$(Configuration)' == 'Release'">true</PublishSingleFile>: Tek dosyalı yayımlamayı etkinleştirir.
  • <RuntimeIdentifier>win-x64</RuntimeIdentifier>: RID'sini win-x64belirtir.
  • <PlatformTarget>x64</PlatformTarget>: 64 bitlik hedef platform CPU'sunu belirtin.

Uygulamayı Visual Studio'dan yayımlamak için kalıcı bir yayımlama profili oluşturabilirsiniz. Yayımlama profili XML tabanlıdır ve .pubxml dosya uzantısına sahiptir. Visual Studio, uygulamayı örtük olarak yayımlamak için bu profili kullanır, ancak .NET CLI kullanıyorsanız, kullanılacak yayımlama profilini açıkça belirtmeniz gerekir.

Çözüm Gezgini projeye sağ tıklayın ve Yayımla... öğesini seçin. Ardından, profil oluşturmak için Yayımlama profili ekle'yi seçin. Yayımla iletişim kutusunda Hedef olarak Klasör'e tıklayın.

The Visual Studio Publish dialog

Varsayılan Konum'u bırakın ve son'u seçin. Profil oluşturulduktan sonra Tüm ayarları göster'i seçin ve Profil ayarlarınızı doğrulayın.

The Visual Studio Profile settings

Aşağıdaki ayarların belirtildiğinden emin olun:

  • Dağıtım modu: Bağımsız
  • Tek dosya üret: işaretli
  • ReadyToRun derlemesini etkinleştir: işaretli
  • Kullanılmayan derlemeleri kırpma (önizlemede): işaretlenmemiş

Son olarak Yayımla'yı seçin. Uygulama derlenmiş ve sonuçta elde edilen .exe dosyası /publish output dizininde yayımlanır.

Alternatif olarak, uygulamayı yayımlamak için .NET CLI kullanabilirsiniz:

dotnet publish --output "C:\custom\publish\directory"

Daha fazla bilgi için bkz. dotnet publish.

Önemli

.NET 6 ile, ayarıyla <PublishSingleFile>true</PublishSingleFile> uygulamada hata ayıklamayı denerseniz, uygulamada hata ayıklayamazsınız. Daha fazla bilgi için bkz . 'PublishSingleFile' .NET 6 uygulamasında hata ayıklarken CoreCLR'ye eklenemiyor.

Windows Hizmeti oluşturma

PowerShell kullanmayı bilmiyorsanız ve hizmetiniz için bir yükleyici oluşturmayı tercih ediyorsanız bkz . Windows Hizmeti yükleyicisi oluşturma. Aksi takdirde, Windows Hizmeti'ni oluşturmak için yerel Windows Hizmet Denetim Yöneticisi'nin (sc.exe) create komutunu kullanın. PowerShell’i Yönetici olarak çalıştırın.

sc.exe create ".NET Joke Service" binpath="C:\Path\To\App.WindowsService.exe"

Bahşiş

Konak yapılandırmasının içerik kökünü değiştirmeniz gerekiyorsa, öğesini belirtirken binpathbunu komut satırı bağımsız değişkeni olarak geçirebilirsiniz:

sc.exe create "Svc Name" binpath="C:\Path\To\App.exe --contentRoot C:\Other\Path"

Bir çıkış iletisi görürsünüz:

[SC] CreateService SUCCESS

Daha fazla bilgi için bkz . sc.exe create.

Windows Hizmeti'ni yapılandırma

Hizmet oluşturulduktan sonra isteğe bağlı olarak yapılandırabilirsiniz. Hizmet varsayılanlarıyla ilgili sorun yaşıyorsanız Hizmet işlevselliğini doğrulama bölümüne atlayın.

Windows Hizmetleri kurtarma yapılandırma seçenekleri sağlar. Geçerli kurtarma yapılandırma değerlerini okumak için (<Service Name>burada hizmetlerinizin adıdır) komutunu kullanarak sc.exe qfailure "<Service Name>" geçerli yapılandırmayı sorgulayabilirsiniz:

sc qfailure ".NET Joke Service"
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: .NET Joke Service
        RESET_PERIOD (in seconds)    : 0
        REBOOT_MESSAGE               :
        COMMAND_LINE                 :

Komutu, henüz yapılandırılmadıkları için varsayılan değerler olan kurtarma yapılandırmasını verir.

The Windows Service recovery configuration properties dialog.

Kurtarmayı yapılandırmak için hizmetinizin adının nerede <Service Name> olduğunu kullanınsc.exe failure "<Service Name>":

sc.exe failure ".NET Joke Service" reset=0 actions=restart/60000/restart/60000/run/1000
[SC] ChangeServiceConfig2 SUCCESS

Bahşiş

Kurtarma seçeneklerini yapılandırmak için terminal oturumunuzun bir Yönetici istrator olarak çalışması gerekir.

Başarıyla yapılandırıldıktan sonra, komutunu kullanarak sc.exe qfailure "<Service Name>" değerleri bir kez daha sorgulayabilirsiniz:

sc qfailure ".NET Joke Service"
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: .NET Joke Service
        RESET_PERIOD (in seconds)    : 0
        REBOOT_MESSAGE               :
        COMMAND_LINE                 :
        FAILURE_ACTIONS              : RESTART -- Delay = 60000 milliseconds.
                                       RESTART -- Delay = 60000 milliseconds.
                                       RUN PROCESS -- Delay = 1000 milliseconds.

Yapılandırılan yeniden başlatma değerlerini görürsünüz.

The Windows Service recovery configuration properties dialog with restart enabled.

Hizmet kurtarma seçenekleri ve .NET BackgroundService örnekleri

.NET 6 ile .NET'e yeni barındırma özel durum işleme davranışları eklendi. Sabit BackgroundServiceExceptionBehavior listesi ad alanına eklendi Microsoft.Extensions.Hosting ve bir özel durum oluştuğunda hizmetin davranışını belirtmek için kullanılır. Aşağıdaki tabloda kullanılabilir seçenekler listelenmiştir:

Seçenek Açıklama
Ignore içinde BackgroundServiceoluşan özel durumları yoksayma.
StopHost işlenmeyen IHost bir özel durum oluştuğunda durdurulur.

.NET 6'nın önceki varsayılan davranışı, zombi işlemlerine (hiçbir şey yapmayan çalışan bir işlem) neden olan şeklindedirIgnore. .NET 6 ile, varsayılan davranış olur StopHostve bu da bir özel durum oluştuğunda konağın durdurulmasıyla sonuçlanır. Ancak temiz bir şekilde durur, yani Windows Hizmeti yönetim sistemi hizmeti yeniden başlatmaz. Hizmetin yeniden başlatılmasına doğru şekilde izin vermek için sıfır olmayan bir çıkış koduyla çağırabilirsiniz Environment.Exit . Aşağıdaki vurgulanmış catch bloğu göz önünde bulundurun:

namespace App.WindowsService;

public sealed class WindowsBackgroundService(
    JokeService jokeService,
    ILogger<WindowsBackgroundService> logger) : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        try
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                string joke = jokeService.GetJoke();
                logger.LogWarning("{Joke}", joke);

                await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
            }
        }
        catch (OperationCanceledException)
        {
            // When the stopping token is canceled, for example, a call made from services.msc,
            // we shouldn't exit with a non-zero exit code. In other words, this is expected...
        }
        catch (Exception ex)
        {
            logger.LogError(ex, "{Message}", ex.Message);

            // Terminates this process and returns an exit code to the operating system.
            // This is required to avoid the 'BackgroundServiceExceptionBehavior', which
            // performs one of two scenarios:
            // 1. When set to "Ignore": will do nothing at all, errors cause zombie services.
            // 2. When set to "StopHost": will cleanly stop the host, and log errors.
            //
            // In order for the Windows Service Management system to leverage configured
            // recovery options, we need to terminate the process with a non-zero exit code.
            Environment.Exit(1);
        }
    }
}

Hizmet işlevselliğini doğrulama

Windows Hizmeti olarak oluşturulan uygulamayı görmek için Hizmetler'i açın. Windows tuşunu (veya Ctrl + Esc) seçin ve "Hizmetler"den arama yapın. Hizmetler uygulamasında hizmetinizi adına göre bulabilmelisiniz.

Önemli

Varsayılan olarak, normal (yönetici olmayan) kullanıcılar Windows hizmetlerini yönetemez. Bu uygulamanın beklendiği gibi çalıştığını doğrulamak için bir Yönetici hesabı kullanmanız gerekir.

The Services user interface.

Hizmetin beklendiği gibi çalıştığını doğrulamak için şunları yapmanız gerekir:

  • Hizmeti başlatma
  • Günlükleri görüntüleme
  • Hizmeti durdurma

Önemli

Uygulamada hata ayıklamak için, Windows Hizmetleri işlemi içinde etkin olarak çalışan yürütülebilir dosyanın hatalarını ayıklamaya çalışmadığınızdan emin olun.

Unable to start program.

Windows Hizmeti'ni başlatma

Windows Hizmeti'ni başlatmak için komutunu sc.exe start kullanın:

sc.exe start ".NET Joke Service"

Aşağıdakine benzer bir çıkış görürsünüz:

SERVICE_NAME: .NET Joke Service
    TYPE               : 10  WIN32_OWN_PROCESS
    STATE              : 2  START_PENDING
                            (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
    WIN32_EXIT_CODE    : 0  (0x0)
    SERVICE_EXIT_CODE  : 0  (0x0)
    CHECKPOINT         : 0x0
    WAIT_HINT          : 0x7d0
    PID                : 37636
    FLAGS

Hizmet Durumu, dışından START_PENDING Çalışıyor durumuna geçer.

Günlükleri görüntüleme

Günlükleri görüntülemek için Olay Görüntüleyicisi açın. Windows tuşunu (veya Ctrl + Esc) seçin ve için arama yapın."Event Viewer" Olay Görüntüleyicisi (Yerel)>Windows Günlükleri>Uygulama düğümünü seçin. Uygulamaların ad alanıyla eşleşen bir Kaynak ile uyarı düzeyi girdisi görmeniz gerekir. Girdiye çift tıklayın veya sağ tıklayıp Olay Özellikleri'ni seçerek ayrıntıları görüntüleyin.

The Event Properties dialog, with details logged from the service

Olay Günlüğü'nde günlükleri gördükten sonra hizmeti durdurmanız gerekir. Dakikada bir rastgele bir şaka kaydetmek için tasarlanmıştır. Bu kasıtlı bir davranıştır ancak üretim hizmetleri için pratik değildir .

Windows Hizmetini Durdurma

Windows Hizmeti'ni durdurmak için komutunu sc.exe stop kullanın:

sc.exe stop ".NET Joke Service"

Aşağıdakine benzer bir çıkış görürsünüz:

SERVICE_NAME: .NET Joke Service
    TYPE               : 10  WIN32_OWN_PROCESS
    STATE              : 3  STOP_PENDING
                            (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
    WIN32_EXIT_CODE    : 0  (0x0)
    SERVICE_EXIT_CODE  : 0  (0x0)
    CHECKPOINT         : 0x0
    WAIT_HINT          : 0x0

Hizmet Durumu durumundan STOP_PENDING Durduruldu durumuna geçer.

Windows Hizmetini Silme

Windows Hizmetini silmek için yerel Windows Hizmet Denetim Yöneticisi'nin (sc.exe) silme komutunu kullanın. PowerShell’i Yönetici olarak çalıştırın.

Önemli

Hizmet Durduruldu durumunda değilse, hemen silinmez. Delete komutunu vermeden önce hizmetin durduruldığından emin olun.

sc.exe delete ".NET Joke Service"

Bir çıkış iletisi görürsünüz:

[SC] DeleteService SUCCESS

Daha fazla bilgi için bkz . sc.exe silme.

Ayrıca bkz.

İleri