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.