49 votes

Service Windows .Net Core 2.0

Je suis en train de construire un Service Windows en .Net Core 2.0 mais j'ai été frapper ma tête sur le mur pour une journée complète et aucun progrès. Tout semble être l'utilisation de Core 1.0/1.1 même la documentation de Microsoft:

L'hôte d'un ASP.NET Core application dans un Service Windows

TopShelf ne prend pas en charge 2.0 ainsi, pour ce que j'ai vu.

J'ai vu quelques-uns bizarre solutions que de mettre tout le code dans un .Net Standard de la Bibliothèque de la Classe et ensuite utiliser un .Net Framework d'application pour héberger le Service de Windows, mais cela n'a pas l'air élégant dans mes yeux et je suis en train d'essayer de se débarrasser of.Net Cadre tout à fait.

Est ce que je veux faire encore possible à l'heure actuelle? Ai-je raté quelque chose de vraiment basique?

28voto

Jeroen Mostert Points 5367

Il est maintenant possible de créer un Service Windows en .NET Core 2.0 sans les bibliothèques de tiers, grâce à la sortie de la Windows Pack de Compatibilité (au moment de l'écriture, encore en bêta). Que la page elle-même met en garde:

Mais avant de commencer le portage, vous devez comprendre ce que vous voulez accomplir avec la migration. Juste le portage .NET de Base parce que c'est un nouveau .NET mise en œuvre n'est pas une assez bonne raison (sauf si vous êtes un Vrai Fan).

En particulier, la rédaction d'un Service Windows en .NET de Base peut-être possible, mais vous n'obtiendrez pas de compatibilité multiplate-forme de la boîte, parce que les assemblées pour les plates-formes autres que Windows va juste jeter un PlatformNotSupportedException si vous essayez d'utiliser le code de service. Travail autour de ce qui est possible (à l'aide d' RuntimeInformation.IsOSPlatform, par exemple), mais c'est une autre question tout à fait.

Aussi, les bibliothèques de tiers peut encore offrir une interface plus conviviale en ce qui concerne l'installation du service de la rédaction, la version actuelle du pack de compatibilité (2.0.0-preview1-26216-02) ne prend pas en charge l' System.Configuration.Install d'espace de noms, de sorte que le défaut de l'approche avec un ServiceProcessInstaller de la classe et de l' installutil ne fonctionnera pas. Plus sur cela plus tard.

Avec tout ce que dit, supposons que vous avez créé un nouveau service Windows (Service1) à partir du modèle de projet (n'est pas strictement nécessaire, car il ne contient rien d'intéressant, d'autres qu'une classe héritant de ServiceBase). Tout ce que vous devez faire pour construire sur .NET Core 2.0 est de modifier et de remplacer l' .csproj avec le nouveau format:

<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp20</TargetFramework>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Windows.Compatibility" Version="2.0.0-*" />
  </ItemGroup>
</Project>

Et puis supprimez properties\AssemblyInfo.cs depuis il n'est plus nécessaire et entrera en conflit avec les informations de version dans le projet lui-même.

Si vous avez déjà un service et qu'il a des dépendances, la conversion peut être plus compliqué. Voir ici.

Maintenant, vous devriez être en mesure d'exécuter dotnet publish et d'obtenir un exécutable. Comme mentionné, vous ne pouvez pas utiliser l' ServiceProcessInstaller de la classe d'installer le service, de sorte que vous devrez manuellement

  • inscrire la source de l'événement utilise le service;
  • créer le service.

Cela peut être fait avec quelques PowerShell. À partir d'un taux élevé d'invite de commandes dans l'emplacement qui contient votre fichier exécutable:

$messageResourceFile = "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\EventLogMessages.dll"
New-EventLog -LogName Application -Source Service1 -MessageResourceFile $messageResourceFile
sc.exe create Service1 binPath= (Resolve-Path .\WindowsService1.exe)

Ce n'est pas l'idéal de plusieurs façons: cela dur-codes le chemin du message fichier de ressources (nous devrions vraiment être de déterminer où c'est à partir de l'exécutable et l'exécution des chemins dans le registre), et il est difficile de codes-le nom du service et le nom de l'exécutable. Voulez-vous donner à votre projet de ses propres capacités d'installation en faisant un peu de ligne de commande de l'analyse en Program.cs, ou utiliser l'une des bibliothèques mentionnés dans Cocowalla de réponse.

17voto

Chenger Points 179

À l'hôte .NET Core 2.0 de l'API Web en tant que Service Windows. J'ai suivi ce guide d'Accueil ASP.NET de Base dans un Service Windows. Les conditions Préalables de la partie n'est pas claire pour moi. Après quelques erreurs, voici ce que j'ai fait: Le Code Source

  1. Créer un ASP.NET de Base de l'Application Web enter image description here
  2. Choisissez API enter image description here
  3. Edit .fichier csproj, besoin de changer de cible cadre de netcoreapp2.0 à net461, explicitement la liste de toutes les références de paquet plutôt qu'à l'aide de Microsoft.AspNetCore.Tous, comme suit

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

  <PropertyGroup>
    <TargetFramework>net461</TargetFramework>
    <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
    <!--<TargetFramework>netcoreapp2.0</TargetFramework>-->
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>

  <ItemGroup>
    <!--<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.6" />-->
    <PackageReference Include="Microsoft.AspNetCore" Version="2.0.2" />
    <PackageReference Include="Microsoft.AspNetCore.Hosting.WindowsServices" Version="2.0.2" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.3" />
    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.0.2" />
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="2.0.1" />
    <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="2.0.2" />
  </ItemGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.3" />
  </ItemGroup>

</Project>
  1. power shell [solution-dossier] dotnet publier -o "[publier-dossier]"
  2. power shell [solution-dossier] sc.exe créer CoreApi binpath="[publier-dossier]\CoreApiHostedAsWindowsService.exe"
  3. power shell [solution-dossier] sc.exe début CoreApi
  4. visite par défaut de l'api power shell [solution-dossier] Invoke-WebRequest http://localhost:5000/api/values

13voto

Cocowalla Points 4798

Je vais résumer quelques options:

  1. Déplacez votre code dans un .NET de la bibliothèque Standard, et l'héberger dans un .NET Framework application, donc vous pouvez utiliser ServiceBase. Bien sûr, ce besoin de l' .NET Framework doit être installé sur la machine cible
  2. Utilisation NSSM (le Non-Sucer Service Manager) pour gérer .NET Core console application (il a une licence du domaine)
  3. Utilisation des appels d'API Windows pour accrocher dans Windows méthodes de service. C'est l'approche adoptée par DotNetCore.WindowsService et dotnet-win32-service (les deux sont sous licence MIT)

Je pense que @JeroenMostert commentaire est un peu sévère, je peux voir l'appel de ne pas être dépendant d'un particulier .NET Framework version disponible sur les ordinateurs cibles. Beaucoup d'autres évidemment ressens la même chose, que les 2 repos j'ai lié sont plutôt populaire.

9voto

peer Points 11386

Dans .NET de Base 2.1 vous êtes en mesure d'utiliser l'ordinateur Hôte et HostBuilder pour obtenir une console application qui s'exécute comme un service. Si vous placer votre console application, vous pouvez déployer le contenant n'importe où et c'est juste le même que l'exécution en tant que service. Vous êtes en mesure d'utiliser l'ordinateur Hôte et HostBuilder pour gérer DI, l'exploitation forestière, L'arrêt, etc dans la console application. Jetez un oeil à:

Services d'hébergement dans .NET de Base l'application de la console

4voto

Marathon55 Points 1836

Un moyen facile de créer un .NET de Base du service Windows est par l'utilisation de Peter Kottas' DotNetCore.WindowsService de la bibliothèque.

Le package NuGet est PeterKottas.DotNetCore.WindowsService. Pour l'installer à l'aide de Visual Studio Manager Console, il suffit d'exécuter

Install-Package PeterKottas.DotNetCore.WindowsService

Il y a de bonnes notes sur la façon de commencer, trop.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X