.NET Core WPF Desktop Bridge - Обход ярлыков на рабочем столе / ярлыков панели задач Проверка наличия обновлений
Там, где я работаю, одно из наших приложений - это приложение.NET Core WPF, которое мы недавно перешли на использование моста рабочего стола. Мы заметили, что если пользователь создает ярлык на рабочем столе или ярлык на панели задач для приложения, используя плитку в меню "Пуск", а затем запускает приложение из указанного ярлыка, приложение пропускает проверку обновлений (даже если оно указано для проверки наличия обновлений). в файле.appinstaller). Также кажется, что приложение не утруждает себя проверкой обновлений в фоновом режиме после открытия приложения, поскольку оно остается той же версии после перезапуска пользователем.
Примечание. Приложение обновляется и отображает подсказку при запуске приложения из меню "Пуск" через активную плитку или запись в меню "Пуск". Мы убедились, что все пользователи и наши машины для разработки используют Windows 10 версии 1903.
Это пример того, как выглядит файл шаблона установщика приложений:
<?xml version="1.0" encoding="utf-8"?>
<AppInstaller Uri="{AppInstallerUri}"
Version="{Version}"
xmlns="http://schemas.microsoft.com/appx/appinstaller/2018">
<MainBundle Name="{Name}"
Version="{Version}"
Publisher="{Publisher}"
Uri="{MainPackageUri}"/>
<UpdateSettings>
<OnLaunch HoursBetweenUpdateChecks="0" ShowPrompt="true" UpdateBlocksActivation="true"/>
<AutomaticBackgroundTask/>
<ForceUpdateFromAnyVersion>true</ForceUpdateFromAnyVersion>
</UpdateSettings>
</AppInstaller>
Я спросил об этом в репозитории MSIX GitHub, но они не ответили. На данный момент нам интересно, сталкивался ли кто-нибудь еще с этой проблемой и смог ли он определить обходной путь или способ ее решения? Есть ли что-то, что нам нужно добавить в наш файл.appxmanifest или что-то еще, что мы пропустили в файле.appinstaller?
Редактировать Тот же вопрос на форумах MSIX, где, скорее всего, ответит MSFT.
Редактировать 2
Мы также получили ответ от Microsoft по этому поводу в репозитории Github и в сообществе разработчиков VS. Они сказали, что собираются изучить это. Я обновлю это снова или отправлю ответ от них, когда у них появится дополнительная информация.
3 ответа
Microsoft смогла ответить на наши заявки, и они сообщили нам, что в настоящее время Windows 10 (1903 г.) не поддерживает запуск средства обновления при запуске приложения с помощью традиционного ярлыка (рабочий стол / панель задач). Рекомендуемый обходной путь - запустить из меню "Пуск" или активной плитки:
https://github.com/MicrosoftDocs/msix-docs/issues/59
Обновить:
Танака Джимха / Хуиос любезно предоставил нам работу по использованию одного из API Windows 10:https://github.com/MicrosoftDocs/msix-docs/issues/59
Чтобы использовать его, вам нужно будет ссылаться на обычные сборки Windows 10, что вы можете сделать вручную или через NuGet. Вы можете найти документацию, как это сделать, здесь:https://docs.microsoft.com/en-us/windows/apps/desktop/modernize/desktop-to-uwp-enhance
Примечание. Если вы используете Rider или Resharper, я предлагаю вам обновить их до версии 2019.2.3, если вы собираетесь использовать эти сборки в том же проекте, что и ваши представления XAML. В более ранних версиях есть ошибка с приложениями.NET Core 3.0 WPF, где пространства имен и классы в библиотеках UWP вызывают странные ошибки, такие как XAML intellisense, говорящий о том, что такие вещи, как сетка, пользовательский элемент управления, окно, панель стека и т. Д., Неоднозначны.
После того, как вы их добавили, вы можете продолжить и начать использовать API в пространстве имен Windows.Management.Deployment. Вот какой-то быстрый и грязный код, чтобы показать вам, как его использовать, но вы, конечно, можете поэкспериментировать и / или обратиться к примеру Танаки по ссылке выше:
Чтобы проверить наличие обновлений, вы можете сделать что-то вроде этого:
public static async Task<bool> CheckForUpdates() { var currentPackage = Package.Current; var status = await currentPackage.CheckUpdateAvailabilityAsync(); return status.Availability == PackageUpdateAvailability.Required || status.Availability == PackageUpdateAvailability.Available; }
Это будет использовать URI в пакете вашего текущего установленного приложения, чтобы увидеть, есть ли какие-либо его новые версии, где бы вы ни держали установщик. Я, вероятно, должен указать, чтобы все было в порядке, вы должны убедиться, что имя пакета должно оставаться неизменным.
Есть много разных способов сделать это, но я нашел один простой способ справиться с этим - использовать элемент AppPackageName в файле проекта для проекта установщика приложения, чтобы гарантировать, что имена папок будут одинаковыми после каждой публикации.
Во-вторых, чтобы получить обновление, загрузить и установить его, вы можете сделать что-то вроде этого:
public static async Task<bool> GetUpdates(string uriToUse)
{
try
{
var packageManager = new PackageManager();
var uri = new Uri(uriToUse);
await packageManager.UpdatePackageAsync(uri, null, DeploymentOptions.ForceApplicationShutdown);
return true;
}
catch (Exception e)
{
//Log the exception, or do something else, up to you
return false;
}
}
Вышеупомянутая попытка догнать есть, поскольку UpdatePackageAsync выдает исключение, если что-то мешает ему загрузить обновление. Это может быть вызвано рядом причин (IE Update уже установлено, плохой сертификат и т. Д.). Вот почему вы можете сначала использовать CheckUpdateAvailabilityAsync() в текущем пакете, прежде чем запускать обновление.
В любом случае, надеюсь, это окажется полезным для всех, кто столкнется с этим, и Microsoft не выпустила обновление для Windows, которое охватывает традиционные ярлыки приложений.
Есть ли способ изменить http://schemas.microsoft.com/appx/appinstaller/2017/2 на http://schemas.microsoft.com/appx/appinstaller/2018 ? Я знаю, что это немного не так, но я не знаю, как «обновить» версию. У меня есть система автоматической сборки, и я обновил все указанные пакеты и целевую версию проекта до принудительной версии (минимальная цель: win 10 версии 1903). Файл .appinstaller будет сгенерирован автоматически. Затем происходит подписание и публикация в Azure. Виртуальная среда - windows-2022. Пространство имен .appinstaller всегда 2017/2, и я действительно не знаю, почему.
Что касается свойств ShowPrompt и ForceUpdateFromAnyVersion, вам нужно указать на эту схему -xmlns="http://schemas.microsoft.com/appx/appinstaller/2018"
в xaml. И они доступны в версии 1903 года. Поэтому, если ваша версия не 1903, вы можете удалить эти два свойства.