介紹如何把Windows Service也打包進MSIX的封裝!
前言
在一開始版本的 MSIX並不支援Windows Service的封裝,但是就在前段時間已經開始支援啦! Windows Service基本上就可以看成背景持行的程式,只是Windows Service能夠存取更加強大的API來時做你想要的功能!今天就來筆記一下如何使用MSIX Packaging Tool來把Windows Service 也打包進去!
開發環境
- Windows 10 latest version (從 Windows 10 2004Version之後開始支援喔 )
- MSIX Packaging Tool latest version ( 這篇文章使用的是 1.2021.709.0 )
- Visual Studio 2019
- UWP workload
- .NET Desktop workload
這邊我已經準備好一隻Windows Service的程式以及一個Console App而非從安裝檔(.exe或是.msi)進行轉換,那然後直接打開MSIX Packaging Tool八
直接從Microsoft Store就可以下載到 MSIX Packaging Tool了!開啟這個工具的時候需要使用管理員權限( Administrator )喔!然後就是老樣子的一步一步地把MSIX先建立起來~
這邊要注意的是安裝位置的選項(上圖中的Installation location)!建議放個空白的資料夾且路徑也別太長。這邊MSIX工具會抓取該目錄的變化來判斷哪些檔案是要被放在安裝的路徑內。
進到這個頁面(上圖)的時候再把實際程式相關的檔案複製到在上一部填寫的安裝位置。
到了這個畫面的時候就可以看到是否有抓取到先前頁面填寫路徑內的執行檔是否有抓取到!若是有多個.exe可以選擇哪個為啟動該應用時的執行程式。
這邊會顯示有沒有偵測到Windows Service的服務~這邊這時候當然還沒有啦(因為我們的情境是直接拿寫好的Windows Service executable)!等等後續的步驟才會實際操作把Windows Service給放進去的步驟!
在這個畫面的時候可以選擇MSIX建立成功後的儲存位置以及 manifest的修改!這邊開始就是重頭戲,按下 Package editor的按鈕進行更加細部的編輯MSIX。
在上圖選擇 Package information的選單有個 manifest file區塊選擇 Open file的按鈕來編輯 MSIX的 package.manifest檔案
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap uap10 rescap">
<!--Package created by MSIX Packaging Tool version: 1.2021.709.0-->
<Identity Name="MyPackage" Publisher="CN=M" Version="1.0.0.0" ProcessorArchitecture="x64" />
<Properties>
<DisplayName>MyPackageFull</DisplayName>
<PublisherDisplayName>M</PublisherDisplayName>
<Description>None</Description>
<Logo>Assets\StoreLogo.png</Logo>
<uap10:PackageIntegrity>
<uap10:Content Enforcement="on" />
</uap10:PackageIntegrity>
</Properties>
<Resources>
<Resource Language="en-us" />
</Resources>
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.1" />
</Dependencies>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
</Capabilities>
</Package>
大概會是長這樣,跟之前介紹的Desktop bridge使用的會是差不多的Manifest內容!接著我們就要來加入能夠啟用 Windows Service的必要步驟了
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" xmlns:desktop6="http://schemas.microsoft.com/appx/manifest/desktop/windows10/6" IgnorableNamespaces="uap uap10 rescap desktop6">
... 這邊先不管 ...
</Package>
先在 Package加上 xml的namespace,這邊使用的desktop device family 宣告的第6版,並在 IgnorableNamespaces加上 desktop6。然後再 Applications的節點內加入以下的 XML Code
<Extensions>
<desktop6:Extension Category="windows.service" Executable=" Package內的相對路徑 ">
<desktop6:Service Name=" 要顯示的Windows Service名稱 " StartupType="auto" StartAccount="localSystem"/>
</desktop6:Extension>
</Extensions>
然後再修改 Capabilities內的Element,如下XML Code
<Capabilities>
<rescap:Capability Name="runFullTrust" />
<rescap:Capability Name="localSystemServices" />
<rescap:Capability Name="packagedServices" />
</Capabilities>
把文字編輯器關閉,並按下建立這樣就可以把 Windows Service 的應用包含在 MSIX啦!
如果有正確的把Windows Service加入MSIX,可以用MSIX Packaging Tool的編輯功能內的 Services report看到該 Windows Service(如下圖)
以上圖為例 Windows Service的名稱會叫做 gRPC SampleService 接著安裝該MSIX的Package之後打開 Task Manager然後再Services的頁籤內就應該可以看到該服務了
總結
MSIX也慢慢地開始把很多強大的桌面功能補足,讓很多既有的應用程式可以嘗試把安裝檔轉換成MSIX的封裝!
***以上Code以及說明都有可能隨著Windows 10 的版本以及Visual Studio 版本有所調整!***
參考資料 Microsoft Docs, Windows Blogs for developer
Supported platforms - MSIX | Microsoft Docs
Create an MSIX package from any desktop installer - MSIX | Microsoft Docs
desktop6:Extension (in Package/Applications) - Windows UWP applications | Microsoft Docs
下次再分享Windows 10 or Windows 11的新技術拉~