Включить/отключить StartupTask в C#

Я хотел бы попросить некоторые предложения о том, как я могу сделать следующее возможным:

Требуемая функциональность: я хочу предоставить пользователям возможность включать и отключать параметр запуска для настольного мостового приложения, которое я создаю во время работы приложения. В идеале при нажатии кнопки через контекстное меню появляется небольшое окно формы, предоставляющее пользователю два варианта. Кнопки «да» или «нет» являются двумя вариантами того, должно ли приложение запускаться автоматически во время загрузки для следующего перезапуска системы.

Используемые технологии: я создал приложение как приложение winform и превратил его в приложение uwp с помощью функции настольного моста. Я сделал это, потому что в конечном итоге оно появится в магазине приложений Windows.

Ссылки: есть API, на который я ссылаюсь, который называется StartupTask, который я нашел на этом сайте: https://docs.microsoft.com/en-us/uwp/api/windows.applicationmodel.startuptask#свойства

У меня уже есть это в моем файле Package.appxmanifest:

<Extensions>
<desktop:Extension
Category="windows.startupTask"
Executable="uniqueFolder\myExeFile.exe"
EntryPoint="Windows.FullTrustApplication">
<desktop:StartupTask
TaskId="myAppTaskID"
Enabled="true"
DisplayName="MyAppDisplayName" />
</desktop:Extension>
</Extensions>

Я успешно добавил эти ссылки:

-Windows(Windows.winmd)
-System.Runtime.WindowsRuntime(WindowsRuntime.dll)
-Windows.ApplicationModel.StartupTaskContract
-Windows.Foundation.FoundationContract

Я изменил ссылку на псевдоним Windows (Windows.winmd), чтобы он был чем-то другим, кроме «глобального», чтобы избежать ошибки компилятора:

StateError The type 'StartupTaskContract' exists in both '...' and '...'.

Следующий код C# — это попытка начать работу с этой функцией, пытаясь получить startuptaskId для приложения, что, к сожалению, выдает мне ошибку.

Код С#:

async void MyFunct()
{
StartupTask startupTask = await StartupTask.GetAsync("myAppTaskID");
}

Ошибка компилятора, которую я сейчас получаю:

StateError CS1929 'IAsyncOperation<StartupTask>' does not contain a definition for 'GetAwaiter' and the best extension method overload 'WindowsRuntimeSystemExtensions.GetAwaiter(IAsyncAction)' requires a receiver of type 'IAsyncAction'

Наконец, эта функция включения и отключения должна отражаться в окне приложений запуска Windows 10, показывающем, что приложение либо включено, либо выключено.

Я пробовал несколько разных вещей без везения. Может быть, я упускаю из виду некоторые вещи, поэтому было бы полезно иметь взгляд со стороны.

С кодом расширения манифеста приложения приложение загружается автоматически при запуске системы.

Я знаю, что пользователи могут просто включить или выключить приложение через окно запуска приложения или диспетчер задач. Но эта функциональность является требованием для клиента.

Любые предложения будут высоко ценится.

Спасибо за чтение~


person someuser193    schedule 09.04.2020    source источник


Ответы (1)


пакеты

  <package id="Antlr" version="3.4.1.9004" targetFramework="net452" />
  <package id="bootstrap" version="3.0.0" targetFramework="net452" />
  <package id="jQuery" version="1.10.2" targetFramework="net452" />
  <package id="jQuery.Validation" version="1.11.1" targetFramework="net452" />
  <package id="Microsoft.AspNet.Identity.Core" version="2.2.1" targetFramework="net452" />
  <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net452" />
  <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net452" />
  <package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.3" targetFramework="net452" />
  <package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net452" developmentDependency="true" />
  <package id="Microsoft.Rest.ClientRuntime" version="2.3.2" targetFramework="net452" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net452" />
  <package id="Modernizr" version="2.6.2" targetFramework="net452" />
  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net452" />
  <package id="Respond" version="1.2.0" targetFramework="net452" />
  <package id="WebGrease" version="1.5.2" targetFramework="net452" />

использование

using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Rest;

метод

void MyFunct()
{

   Task.Factory.StartNew(s => StartupTask.GetAsync("myAppTaskID"), this, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default).GetAwaiter();

// or 

   StartupTask.GetAsync("myAppTaskID").wait();
}
person Mertuarez    schedule 09.04.2020
comment
Спасибо за ваш ответ. Я попробовал ваше предложение и получил следующую ошибку: Ошибка CS1929 «Task‹IAsyncOperation‹StartupTask››» не содержит определения для «Unwrap», а лучшая перегрузка метода расширения «TaskExtensions.Unwrap(Task‹Task›)» требует приемник типа «Задача‹Задача›». Мне не хватает какой-то dll или используемого пространства имен? - person someuser193; 09.04.2020
comment
Я сделал некоторые изменения. - person Mertuarez; 09.04.2020
comment
Очень ценю вашу помощь. На этот раз я не получаю ошибок компилятора при компиляции приложения, но часть StartupTask.GetAsync(myAppTaskID) метода StartNew не будет выполняться таким образом. Я знаю это, потому что, если я попытаюсь упростить этот оператор до только это: var myVar = StartupTask.GetAsync(myAppTaskID); и я пытаюсь получить доступ к этой упрощенной части кода во время выполнения, я получаю ошибку времени выполнения, которая приводит к сбою приложения. Ошибка говорит System.Exception: элемент не найден. (Исключение из HRESULT: 0x800...) в Windows.ApplicationModel.StartupTask.GetAsync(String taskId).Что вы об этом думаете - person someuser193; 10.04.2020
comment
Это наводит меня на мысль, что метод StartNew игнорируется или никогда не запускается, потому что он не может получить доступ к этому элементу. Затем, когда я пытаюсь получить к нему доступ напрямую с помощью этой упрощенной версии, я получаю ту ошибку времени выполнения, которая приводит к сбою приложения. Когда вы попробовали это со своей стороны, смогли ли вы успешно изменить параметры запуска приложений с помощью этого кода и отразились ли они в окне приложений запуска Windows 10 или диспетчере задач? Если да, то что я делаю не так? - person someuser193; 10.04.2020
comment
Возможно, в вашей задаче отсутствует интерфейс или что-то вроде IBackgroundTask. - person Mertuarez; 10.04.2020
comment
Привет еще раз, извините за поздний ответ. Я немного повозился и понял проблему. Я считаю, что ваше решение работает, но я смог выполнить то же самое, не используя метод StartNew. Причина, по которой я получал ошибка element not found была связана с тем, что я обращался к этому строковому коду StartupTask.GetAsync(myAppTaskID) из неупакованного приложения winform, где этот код должен ссылаться только на код файла манифеста приложения UWP. После того, как я упаковал приложение с мостом для рабочего стола и получил доступ к этому коду как к приложению UWP, оно заработало. Спасибо за помощь! - person someuser193; 14.04.2020
comment
@someuser193 мило :D - person Mertuarez; 29.05.2020