現在可以在沒有第三方庫的情況下使用.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