Windows 10 UWP 47 of N: MSIX 應用程式封裝工具 Part 5 - App service

讓 MSIX 內封裝的應用程式,不論是Win32還是UWP都可以使用 App service 來做IPC。

前言

現在應用程式難免都會遇到 Crash的問題,很多時候就要去翻 Crash Log 來分析問題點在哪邊。這篇文章我們來介紹MSIX中有提供的功能之一PSF ( Package Support Framework )這個功能能夠適用以下情境

  • 缺少某些DLL檔案
  • 啟用APP的時候支援帶入參數
  • 寫入資料到安裝路徑的時候出現 access denied
  • 安裝時期執行某些Script

因為MSIX使用了VFS ( Virtual File System )並且放在 Program Files\WindowsApps 的資料夾中,所以不能被外部的程式直接存取並修改!所以如果需要修復以上類似的情境(當然還有其他情境也適用)就可以使用PSF的功能。那我們就直接開始動手來玩玩PSF八


開發環境

  • Windows 10 latest version
  • MSIX Packaging Tool
  • Visual Studio 2019
    • UWP workload
    • .NET Desktop workload

先前提過MSIX跟傳統封裝的執行檔能夠存取的路徑是有所差異的!比如來說很常會把Config檔案(跟Windows user無關的Config)放在跟Exe在一起,這個時候就會讓原本的程式遇上大問題。

都是存取CurrentDirectory 但是放在MSIX裡面的卻是走到 SysWOW64 (使用的CPU架構不同會走不同的路徑喔!但是就是不會指到執行中Exe的路徑) ,而非我們一般認知的跟Exe在同一路徑!這時候該怎麼處理來達到沿用這樣的Code就是MSIX的PSF可以處理的時候。加入PSF的方式有提供蠻多種方式,這邊我使用CLI的方式進行。

使用 Command line的方式,先去 nuget.org ( https://www.nuget.org/downloads ) 可以抓最新的 nuget.exe binary然後執行一下指令

nuget install Microsoft.PackageSupportFramework

這時候等 nuget 把PSF抓下來就接著看下圖,目前抓到最新的正式版本是1.0.200410.1的版本然後在進去到bin裡面就會有相關的檔案我們需要加入到 Windows Application Packaging project之中

這邊如果使用 x86就是需要放以下幾個檔案

  • PsfLauncher32.exe
  • PsfRunDll32.exe
  • PsfRuntime32.dll

然後是要編譯成x64的環境是以下幾個檔案

  • PsfLauncher64.exe
  • PsfRunDll64.exe
  • PsfRuntime64.dll

以上就是PSF會需要用到的相關檔案!接者就是要調整Manifest檔案了,讓Manifest從原本啟動的APP改成啟動PSFLauncher的方式執行。

這邊其他DLL有其他用途列在下方

  • FileRedirectionFixup32.dll / FileRedirectionFixup64.dll
    • 處理檔案存取權限相關的DLL
  • TraceFixup32.dll / TraceFixup64.dll
    • 可以標示出應用程式錯誤的DLL
  • WaitForDebuggerFixup32.dll / WaitForDebuggerFixup64.dll
    • 讓Debugger附加主程式的DLL

以下是修改前的Manifest 大致檔案內容,重點就是Application的Element

<Applications>
    <Application Id="App" Executable="SampleCSharp.App\SampleCSharp.App.exe" EntryPoint="Windows.FullTrustApplication">
      ...
    </Application>
  </Applications>

調整成如下(如果是使用x64的環境) 在 Application的Element要修改調整成PsfLauncher的相對路徑然後 Id 需要記錄起來在後面會用上。

<Applications>
    <Application Id="PSFAPP" Executable="PsfLauncher64.exe" EntryPoint="Windows.FullTrustApplication">
      ...
    </Application>
  </Applications>

然後就到最後一步驟了,建立一個JSON檔案且檔名為 config.json 。然後寫入如下Sample Code,這邊要注意的是Application的Id要跟manifest一致,且executable在JSON的會是實際要執行的應用程式

{
  "applications": [
    {
      "Id": "PSFAPP",
      "executable": "SampleCSharp.App/SampleCSharp.App.exe",
      "workingDirectory": "SampleCSharp.App"
    }
  ]
}

然後使用MSIX Packaging Tool 重新封裝成MSIX就可以了!

 


總結

使用PSF可以讓IT或是包版人員可以不需要修改程式碼的情況下針對一些問題進行修復!而MSIX本身提供的VFS可以讓整體應用程式安全且不用擔心一些相關檔案被串改的問題,新型態的應用程式封裝讓Windows 也能夠更加安全且便利。

 

***以上Code以及說明都有可能隨著Windows 10 的版本以及Visual Studio 版本有所調整!***

參考資料 Microsoft Docs,Windows Blogs for developer

下次再分享Windows 10 的新技術拉~