遷移桌面程序到MS Store(9)——APPX With Desktop Extension

《遷移桌面程序到MS Store(8)——通過APPX下載Win32Component》中我們討論了通過APPX來下載Service部分的安裝包。但是純UWP的客戶端並不能自動運行下載的exe或者msi文件。本篇將着手解決這個問題。
假設我們有如下結構的application,藍色APPX中包含UWP及.NET Standard Libraries。而Service部分以WCF的形式Host在Windows Service上,這其中包含了諸如Win32 API等無法遷移到UWP的內容。

因爲用戶不願除了從MS Store下載外,再額外手動下載Service部分的安裝包。所以我們希望在APPX中,包含額外的exe或msi安裝包,通過Packaging工程的形式來打包成APPX,結構圖如下所示,綠色UWP Client包含了UWP UI及.NET Standard Libraries,而Service部分直接以exe或msi形式嵌入。

樣例代碼放在全球最大的同性交友平臺GitHub:
https://github.com/manupstairs/AppxWithDesktopExtension
也可以去MS Store試下成品:
https://www.microsoft.com/store/productid/9N22D8RLKZN2
首先看AppWithDesktopExtension1文件夾,由三個工程組成。

UWPClient是一個標準的UWP工程,該工程僅有一個Button按鈕,在點擊該按鈕後,去啓動DotNetConsoleApp.exe程序。

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel.FullTrustAppContract", 1, 0))
            {
                await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
            }
        }

默認的UWP工程的references中是不包含ApiInformation類及FullTrustProcessLauncher類的。這裏我們需要添加Windows Desktop Extensions for the UWP的引用。

UWPClient本身並不能包含exe或者Win32App的工程,所以我們還是需要通過Packaging工程來同時包含二者。首先在AppxWithDesktopExtension工程的Applications中添加UWPClient的引用。然後再將生成好的DotNetConsoleApp.exe拷貝到AppxWithDesktopExtesion工程。假設該exe文件是一個installer文件,所以我們不是添加工程的reference而是直接添加該exe文件。

這裏有個需要注意的地方是,建議建一個同名文件夾放置exe文件。直接添加exe到根目錄的話,我在提交商店預處理的時候遇到“DotNetConsoleApp.exe“ doesn't exist in the package的錯誤,我有理由相信這是某軟對路徑的判斷沒處理好,但是咱們犟不過他,只好模仿添加工程reference的情況下的文件結構,來繞過去這個問題。

此時該Packaging工程已同時包含UWPClient及DotNetConsoleApp.exe兩部分內容。然而實現二者之間的調用,我們還需要編輯Packaging工程的Package.appxmanifest文件,選中該文件後右鍵點擊Open with…然後再彈出的對話框中選擇XML(Text)Editor。

在Package.appxmanifest文件的Application節點中添加如下內容:

      <Extensions>
        <desktop:Extension
          xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
          Category="windows.fullTrustProcess"
          Executable="DotNetConsoleApp\DotNetConsoleApp.exe" />
      </Extensions>

至此,我們已基本完成了Appx with Desktop Extension的操作,幾乎已經可以使用一個很流行的詞叫“閉環”。但是等等,在點擊F5運行之前,有個設置還需要改一下。在Solution文件上右鍵選中Properties,然後在Configuration中,將Packaging工程的Platform改成和UWPClient一致。UWPClient默認是x86,當然你都改成x64也可以。

有同學肯定要問爲什麼不能選AnyCPU,這是因爲UWP使用了.NET Native預編譯技術,是Platform相關的,詳見:
.NET Native – What it means for Universal Windows Platform (UWP) developers
https://blogs.windows.com/buildingapps/2015/08/20/net-native-what-it-means-for-universal-windows-platform-uwp-developers/#mhT71xdPsoIclvV0.97
With .NET Native brought into the mix, AnyCPU is no longer a valid build configuration because native compilation is architecture dependent.
最後在我們運行AppxWithDesktopExtension程序之前,先看一眼DotNetConsoleApp工程到底做了什麼。

namespace DotNetConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Suppose I'm an installer.");
            Console.ReadLine();
        }
    }
}

是的,我們啥也沒做,就是打印一行字假裝我們是installer。實際在Appx我們也並沒有引用該工程,而僅是包含了事先build好的DotNetConsoleApp.exe文件。
點擊F5運行AppWithDesktopExtension工程,結果如下圖所示。

本篇內容至此結束,附上GitHub地址:
https://github.com/manupstairs/AppxWithDesktopExtension
MS Store:
https://www.microsoft.com/store/productid/9N22D8RLKZN2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章