现在可以在没有第三方库的情况下使用.NET Core 2.0编写Windows服务,这要归功于Windows Compatibility Pack的发布(在撰写本文时,仍处于预发布阶段)。正如页面本身警告的那样:
但是在你开始移植之前,你应该明白你想用 完成迁移。只是移植到.NET Core,因为它是 新的.NET实现并不是一个很好的理由(除非你是一个真正的粉丝)。
特别是,在.NET核心编写Windows服务现在是可能的,但你不会得到跨平台兼容性,开箱即用,因为Windows以外平台上的组件将只是抛出一个PlatformNotSupportedException
如果您尝试使用服务代码。可以解决这个问题(例如使用RuntimeInformation.IsOSPlatform
),但这完全是另一个问题。
另外,第三方库在安装服务方面仍然可以提供更好的接口:从编写起,当前版本的兼容包(2.0.0-preview1-26216-02
)不支持System.Configuration.Install
命名空间,因此缺省方法ServiceProcessInstaller
类和installutil
将不起作用。稍后更多。我们假设您已经从项目模板中创建了一个全新的Windows服务(Service1
)(由于它不包含任何有趣的内容,除了继承自ServiceBase
的类以外没有任何其他内容),所以我们假设您已经创建了一个全新的Windows服务(Service1
)。所有你需要做的,使之建立在.NET核2.0是编辑和使用新的格式替换.csproj
:
<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>
,然后删除properties\AssemblyInfo.cs
因为它不再需要将与版本信息发生冲突项目本身。
如果您已经有服务并且具有相关性,转换可能会更复杂。请参阅here。
现在你应该可以运行dotnet publish
并获得一个可执行文件。如上所述,您不能使用ServiceProcessInstaller
类来安装该服务,因此您必须手动输入
这可以通过一些PowerShell完成。从提升的提示中包含您发布的可执行文件的位置:
$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)
这不是在几个方面的理想:这个硬编码的消息资源文件的路径(我们真的应该确定它在哪里来自注册表中的可执行文件路径和运行时路径),并对服务名称和可执行文件名称进行硬编码。您可能希望通过在Program.cs
中执行一些命令行解析来为您的项目提供自己的安装功能,或使用Cocowalla's answer中提到的其中一个库。
[Windows服务与.NET核心]可能的重复(https://stackoverflow.com/questions/41014513/windows-service-with-net-core) –
'试图摆脱.Net框架干脆'试图建立一个_Windows_服务可能是一场艰苦的战斗.. – thisextendsthat