2016年5月21日 星期六

Headless app with Windows Universal App

在windows iot core中,app可部署為背景執行的Headless與前景執行的Headed 兩種模式

在這次的專案中,我需要的是背景執行的web services

於是開始了一段○○××的找文件之旅

因為在官方文件中,並沒有看到要如何設定一個Headless類型的專案類型

完整的專案建置過程如下:

首先,在visual studio上建立一個空白的Windows Universal App專案



接著,裝預設為前景的專案變更為背景執行的Headless模式

step 1.
刪除兩個預先產生的.xmal檔案

step 2.
以檢視原始碼的方式打開專案的Package.appxmanifest
修改內容,增加 iot 的namespace宣告
xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10"
然後在IgnorableNamespaces新增一個iot的項目
IgnorableNamespaces="uap mp iot"

如下圖所示

step 3.
Package.appxmanifest還有一部份要修改
在Applications的node中,刪除Executable和EntryPoint兩個attribute
並且在這個node中,加入一個attribute
AppListEntry="none"

另外還要加入extensions
<Extensions>
     <Extension Category="windows.backgroundTasks" 
                  EntryPoint="TestHeadless.StartupTask">
          <BackgroundTasks>
            <iot:Task Type="startup" />
          </BackgroundTasks>
     </Extension> 
</Extensions>   
       
     

完成後結果如下圖所示

step 4.
加入專案參考 - Windows IoT Extension for the UWP
視專案需求選擇版本,
因為在新增專案時,我選10.0.10586,所以就用新版的囉

step 5. 配合剛才設定檔中的EntryPoint,新增StartupTask.cs
using System;
using System.Diagnostics;
using Windows.ApplicationModel.Background;
using Windows.System.Threading;

namespace TestHeadless
{
    public sealed class StartupTask : IBackgroundTask
    {
        BackgroundTaskDeferral _deferral;
        ThreadPoolTimer timer;
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            _deferral = taskInstance.GetDeferral();
         }
   }
}

到目前為止,如果以為這樣就可以的話,就大錯特錯
如果現在建置專案,你會發現會有Error
告訴你的EntryPoint裡沒有Main function
因此要修改專案的定義檔

step 6.
在專案上點選滑鼠右鍵,選擇「卸載專案」,
然後再點滑鼠右鍵,編輯專案定義檔 .csproj


將OutputType修改為winmdobj
原本內容為AppContainerExe

另外加入以下兩行,
<appxpackage>true</appxpackage>
<containsstartuptask>true</containsstartuptask>
如下圖



重新載入專案後,即完成Headless app的開發設定

Reference:
how-to-build-a-headless-windows-10-iot-app


沒有留言: