Подготовка к упаковке классического приложенияPrepare to package a desktop application

В этой статье приводится информация, которую необходимо знать, прежде чем упаковывать классические приложения.This article lists the things you need to know before you package your desktop application. Вам может не потребоваться много усилий для подготовки приложения к процессу упаковки, но если какое бы то ни было из условий ниже применимо к вашему приложению, необходимо разрешить соответствующую задачу перед упаковкой.You might not have to do much to get your application ready for the packaging process, but if any of the items below apply to your application, you need to address it before packaging.

  • Для приложения .NET требуется версия .NET Framework более ранняя, чем 4.6.2.Your .NET application requires a version of the .NET Framework earlier than 4.6.2. При упаковке приложения .NET рекомендуется, чтобы для него использовалась платформа .NET Framework 4.6.2 или более поздней версии.If you are packaging a .NET application, we recommend that your application target .NET Framework 4.6.2 or later. Возможность установки и запуска упакованных классических приложений впервые появилась в Windows 10 версии 1607 (также именуемой юбилейным обновлением). Эта версия ОС включает в себя .NET Framework 4.6.2 по умолчанию.The ability to install and run packaged desktop applications was first introduced in Windows 10, version 1607 (also called the Anniversary Update), and this OS version includes the .NET Framework 4.6.2 by default. Более поздние версии ОС включают в себя более поздние версии .NET Framework.Later OS versions include later versions of the .NET Framework. Полный список версий .NET, которые входят в состав более поздних версий Windows 10, см. в этой статье.For a full list of what versions of .NET are included in later versions of Windows 10, see this article.

    .NET Framework более ранних версий, чем 4.6.2, работает с упакованными классическими приложениями в большинстве случаев.Targeting versions of the .NET Framework earlier than 4.6.2 in packaged desktop applications is expected to work in most cases. Тем не менее, если вы используете более раннюю версию, чем 4.6.2, следует полностью протестировать упакованное классическое приложение перед его распространением среди пользователей.However, if you target an earlier version than 4.6.2, you should fully test your packaged desktop application before distributing it to users.

    • 4.0–4.6.1. Ожидается, что приложения, предназначенные для этих версий .NET Framework, будут работать без проблем на платформе версии 4.6.2 или более поздних версий.4.0 - 4.6.1: Applications that target these versions of the .NET Framework are expected to run without issues on 4.6.2 or later. Поэтому такие приложения должны устанавливаться и работать без изменений в Windows 10 версии 1607 или более поздних с версией .NET Framework, которая предусмотрена в операционной системе.Therefore, these applications should install and run without changes on Windows 10, version 1607 or later with the version of the .NET Framework that is included with the OS.

    • 2.0 и 3.5. Согласно результатам нашего тестирования упакованные классические приложения, разработанные для этих версий .NET Framework, обычно работают, но в некоторых сценариях могут возникать проблемы с производительностью.2.0 and 3.5: In our testing, packaged desktop applications that target these versions of the .NET Framework generally work but may exhibit performance issues in some scenarios. Чтобы эти упакованные приложения могли устанавливаться и запускаться, на целевом компьютере должен быть установлен компонент .NET Framework 3.5 (он также включает в себя .NET Framework 2.0 и 3.0).In order for these packaged applications to install and run, the .NET Framework 3.5 feature must be installed on the target machine (this feature also includes .NET Framework 2.0 and 3.0). Следует также тщательно протестировать эти приложения после их упаковки.You should also test these applications thoroughly after you package them.

  • Приложение всегда запускается с повышенными правами безопасности.Your application always runs with elevated security privileges. Ваше приложение должно работать при использовании данных текущего пользователя.Your application needs to work while running as the interactive user. Пользователи, которые устанавливают приложение, могут не быть системными администраторами, поэтому требование использовать более высокие привилегии для вашего приложения означает, что оно будет работать неправильно у обычных пользователей.Users who install your application may not be system administrators, so requiring your application to run elevated means that it won't run correctly for standard users. Если вы планируете опубликовать приложение в Microsoft Store, помните, что приложения, для использования любых функций которых требуется повышение прав, не будут приниматься в Store.If you plan on publishing your app to the Microsoft Store, apps that require elevation for any part of their functionality won't be accepted into the Store.

  • Для приложения требуется работающий в режиме ядра драйвер или служба Windows.Your application requires a kernel-mode driver or a Windows service. Пакеты MSIX не поддерживают работающий в режиме ядра драйвер или службу Windows, которая должна работать с использованием системной учетной записи.MSIX does not support a kernel-mode driver or a Windows service that needs to run under a system account. Вместо службы Windows используйте фоновую задачу.Instead of a Windows service, use a background task.

  • Модули вашего приложения загружаются во внутрипроцессном режиме в процессы, которые отсутствуют в пакете приложения для Windows.Your app's modules are loaded in-process to processes that are not in your Windows app package. Это запрещено и означает, что внутрипроцессные расширения, такие как расширения оболочки не поддерживаются.This isn't permitted, which means that in-process extensions, like shell extensions, aren't supported. Но если у вас есть два приложения в одинаковом пакете, вы можете настроить межпроцессное взаимодействие между ними.But if you have two apps in the same package, you can do inter-process communication between them.

  • Необходимо обеспечить, чтобы приложение установило все расширения там, где установлено само приложение.Ensure that any extensions installed by the application will install where the application is installed. Windows позволяет пользователям и ИТ-менеджерам изменять расположение установки по умолчанию для пакетов.Windows allows users and IT managers to change the default install location for packages. Для этого выберите элементы "Параметры->Система->Хранилище->Дополнительные параметры хранилища->Change where new content is saved to (Изменение места сохранения нового содержимого)->New Apps will save to (Новые приложения будут сохраняться в)".See "Settings->System->Storage->More Storage Settings-> Change where new content is saved to -> New Apps will save to". Если вы устанавливаете расширение с помощью приложения, убедитесь, что расширение не предусматривает дополнительные ограничения в отношении папки установки.If you are installing an extension with your application, make sure that the extension does not have additional installation folder restrictions. Например, некоторые расширения могут отключать установку на несистемные диски.For example, some extensions may disable installing their extension to non-system drives. Если в таком случае изменить расположение по умолчанию, это повлечет возникновение ошибки 0x80073D01 (ERROR_DEPLOYMENT_BLOCKED_BY_POLICY).This will result in an error 0x80073D01 (ERROR_DEPLOYMENT_BLOCKED_BY_POLICY) if the default location has been changed.

  • Ваше приложение использует настраиваемый идентификатор модели пользователя приложения (AUMID) .Your application uses a custom Application User Model ID (AUMID). Если ваш процесс вызывает команду SetCurrentProcessExplicitAppUserModelID, чтобы задать собственный AUMID, то можно использовать только AUMID, созданный для процесса средой модели приложения или пакетом приложения для Windows.If your process calls SetCurrentProcessExplicitAppUserModelID to set its own AUMID, then it may only use the AUMID generated for it by the application model environment/Windows app package. Вы не можете определять пользовательские AUMID.You can't define custom AUMIDs.

  • Ваше приложение изменяет куст реестра HKEY_LOCAL_MACHINE (HKLM) .Your application modifies the HKEY_LOCAL_MACHINE (HKLM) registry hive. Любая попытка приложения создать раздел HKLM или открыть такой раздел для изменения приведет к сбою в виде отказа в доступе.Any attempt by your application to create an HKLM key, or to open one for modification, will result in an access-denied failure. Не забывайте, что у вашего приложения есть собственное закрытое виртуализированное представление реестра, поэтому в такой ситуации понятие куста реестра на уровне пользователя или компьютера (чем является HKLM) неприменимо.Remember that your application has its own private virtualized view of the registry, so the notion of a user- and machine-wide registry hive (which is what HKLM is) does not apply. Потребуется найти другой способ достичь того, чего требовалось при использовании HKLM, например запись в HKEY_CURRENT_USER (HKCU).You will need to find another way of achieving what you were using HKLM for, like writing to HKEY_CURRENT_USER (HKCU) instead.

  • Ваше приложение использует подраздел реестра ddeexec в качестве средства для запуска другого приложения.Your application uses a ddeexec registry subkey as a means of launching another app. Вместо этого используйте один из обработчиков команды DelegateExecute в соответствии с настройками различных расширений Activatable* в вашем манифесте пакета приложения.Instead, use one of the DelegateExecute verb handlers as configured by the various Activatable* extensions in your app package manifest.

  • Ваше приложение выполняет запись в папку AppData или в реестр с перспективой обмена данными с другим приложением.Your application writes to the AppData folder or to the registry with the intention of sharing data with another app. После преобразования данные папки AppData перенаправляются в локальное хранилище данных приложения, являющееся частным хранилищем для каждого приложения.After conversion, AppData is redirected to the local app data store, which is a private store for each app.

    Все записи, которые ваше приложение вносит в куст реестра HKEY_LOCAL_MACHINE, перенаправляются в изолированный двоичный файл, а все записи, которые ваше приложение вносит в куст реестра HKEY_CURRENT_USER, помещаются в отдельное для каждого пользователя или каждого приложения расположение.All entries that your application writes to the HKEY_LOCAL_MACHINE registry hive are redirected to an isolated binary file and any entries that your application writes to the HKEY_CURRENT_USER registry hive are placed into a private per-user, per-app location. Дополнительные сведения о перенаправлении файлов и реестра см. в статье о работе моста для классических приложений.For more details about file and registry redirection, see Behind the scenes of the Desktop Bridge.

    Используйте другие средства межпроцессного обмена данными.Use a different means of inter-process data sharing. Подробнее: Хранение и извлечение параметров и прочих данных приложения.For more info, see Store and retrieve settings and other app data.

  • Приложение выполняет запись в каталог установки приложения.Your application writes to the install directory for your app. Например, ваше приложение выполняет запись в файл журнала, который вы поместили в тот же каталог, что и EXE-файл.For example, your application writes to a log file that you put in the same directory as your exe. Эта операция не поддерживается, поэтому потребуется найти другое расположение, например, локальное хранилище данных приложения.This isn't supported, so you'll need to find another location, like the local app data store.

  • Приложение использует текущий рабочий каталог.Your application uses the current working directory. В среде выполнения ваше упакованное классическое приложение не получит тот же рабочий каталог, который ранее указан для вашего ярлыка LNK на рабочем столе.At runtime, your packaged desktop application won't get the same working directory that you previously specified in your desktop .LNK shortcut. Необходимо изменить CWD в среде выполнения, если у вашего приложения должен быть правильный каталог, чтобы оно работало должным образом.You need to change your CWD at runtime if having the correct directory is important for your application to function correctly.

    Примечание

    Если приложению требуется выполнять запись в каталог установки или использовать текущий рабочий каталог, можно также добавить в пакет исправление среды выполнения с помощью платформы поддержки пакетов.If your app needs to write to the installation directory or use the current working directory, you can also consider adding a runtime fixup using the Package Support Framework to your package. Дополнительные сведения см. в этой статье.For more details, see this article.

  • Для установки приложения требуется участие пользователя.Your application installation requires user interaction. Ваш установщик приложения должен поддерживать возможность работы в автоматическом режиме, а также должен устанавливать все свои дополнительные компоненты, которых нет по умолчанию в чистом образе ОС.Your application installer must be able to run silently, and it must install all of its prerequisites that aren't on by default on a clean OS image.

  • Для приложения требуется UIAccess.Your application requires UIAccess. Если приложение задает значение UIAccess=true элементу requestedExecutionLevel в манифесте контроля учетных записей (UAC), то преобразование в пакет MSIX сейчас не поддерживается.If your application specifies UIAccess=true in the requestedExecutionLevel element of the UAC manifest, conversion to MSIX isn't supported currently. Подробнее см. в разделе Обзор системы безопасности модели автоматизации пользовательского интерфейса.For more info, see UI Automation Security Overview.

  • Приложение предоставляет COM-объекты.Your application exposes COM objects. Процессы и расширения из пакета могут регистрировать и использовать COM- и OLE-серверы, как внутри, так и вне процессов.Processes and extensions from within the package can register and use COM & OLE servers, both in-process and out-of-process (OOP). В Creators Update добавлена поддержка технологии упаковки COM-объектов, позволяющая вне процессов регистрировать COM- и OLE-серверы, которые теперь видны за пределами пакета.The Creators Update adds Packaged COM support which provides the ability to register OOP COM & OLE servers that are now visible outside the package. Дополнительные сведения см. в записи блога COM Server and OLE Document support for Desktop Bridge (Поддержка COM-сервера и документа OLE для моста для классических приложений).See COM Server and OLE Document support for Desktop Bridge.

    Технология упакованных COM-объектов работает с существующими API COM, но не будет работать для расширений приложения, которые напрямую считывают реестр, так как расположение для упакованных COM-объектов находится в частном расположении.Packaged COM support works with existing COM APIs, but will not work for application extensions that rely upon directly reading the registry, as the location for Packaged COM is in a private location.

  • Приложение разрешает другим процессам использовать сборки из глобального кэша сборок (GAC) .Your application exposes GAC assemblies for use by other processes. Приложение не может предоставлять сборки GAC процессам из исполняемых файлов, которые являются внешними по отношению к пакету приложения Windows.Your application cannot expose GAC assemblies for use by processes originating from executables external to your Windows app package. Процессы из пакета могут регистрировать и использовать сборки GAC обычным образом, но они не будут видны извне.Processes from within the package can register and use GAC assemblies as normal, but they will not be visible externally. Это означает, что сценарии межпрограммного взаимодействия (например, OLE) не будут работать при их вызове внешними процессами.This means interop scenarios like OLE will not function if invoked by external processes.

  • Приложение связывается с библиотеками среды выполнения C (CRT) неподдерживаемым способом.Your application is linking C runtime libraries (CRT) in an unsupported manner. Библиотека времени выполнения C/C++ Майкрософт предоставляет процедуры для программирования в среде операционной системы Microsoft Windows.The Microsoft C/C++ runtime library provides routines for programming for the Microsoft Windows operating system. Эти процедуры автоматизируют выполнение многих распространенных задач программирования, которые не предоставляются языками C и C++.These routines automate many common programming tasks that are not provided by the C and C++ languages. Если ваше приложение использует библиотеку среды выполнения C или C++, необходимо убедиться, что связь с ней устанавливается поддерживаемым способом.If your application utilizes C/C++ runtime library, you need to ensure it is linked in a supported manner.

    Visual Studio 2017 поддерживает как динамическое связывание, чтобы в коде можно было использовать общие файлы DLL, так и статическое связывание для связывания библиотеки с текущей версией CRT прямо в коде.Visual Studio 2017 supports both static and dynamic linking, to let your code use common DLL files, or static linking, to link the library directly into your code, to the current version of the CRT. Мы рекомендуем по возможности использовать в приложениях динамическое связывание Visual Studio 2017.If possible, we recommend your application use dynamic linking with VS 2017.

    Поддержка различных типов связывания зависит от версии Visual Studio.Support in previous versions of Visual Studio varies. Подробности см. в следующей таблице:See the following table for details:

    Версия Visual StudioVisual Studio versionДинамическое связываниеDynamic linkingСтатическое связываниеStatic linking
    2005 (VC 8)2005 (VC 8)Не поддерживаетсяNot supportedПоддерживаетсяSupported
    2008 (VC 9)2008 (VC 9)Не поддерживаетсяNot supportedПоддерживаетсяSupported
    2010 (VC 10)2010 (VC 10)ПоддерживаетсяSupportedПоддерживаетсяSupported
    2012 (VC 11)2012 (VC 11)ПоддерживаетсяSupportedНе поддерживаетсяNot supported
    2013 (VC 12)2013 (VC 12)ПоддерживаетсяSupportedНе поддерживаетсяNot supported
    2015 и 2017 (VC 14)2015 and 2017 (VC 14)ПоддерживаетсяSupportedПоддерживаетсяSupported

    Примечание. Во всех случаях связывание необходимо выполнять с общедоступной библиотекой CRT самой последней версии.Note: In all cases, you must link to the latest publicly available CRT.

  • Приложение устанавливает и загружает сборки из параллельной папки side-by-side (SxS) Windows.Your application installs and loads assemblies from the Windows side-by-side folder. Например, в вашем приложении используются библиотеки среды выполнения C VC8 или VC9 и они динамически связываются из папки SxS Windows, т. е. в коде используются общие файлы DLL из общей папки.For example, your application uses C runtime libraries VC8 or VC9 and is dynamically linking them from Windows side-by-side folder, meaning your code is using the common DLL files from a shared folder. Такой способ связывания не поддерживается.This is not supported. Необходимо подключать их статически, то есть связать с распространяемыми файлами библиотеки непосредственно в самом коде.You will need to statically link them by linking to the redistributable library files directly into your code.

  • Ваше приложение использует зависимость в папке System32/SysWOW64.Your application uses a dependency in the System32/SysWOW64 folder. Чтобы эти файлы DLL начали работать, необходимо включить их в часть вашего пакета приложения для Windows, находящуюся в виртуальной файловой системе.To get these DLLs to work, you must include them in the virtual file system portion of your Windows app package. Это обеспечит, что приложение будет работать так, как если бы файлы DLL были установлены в папке System32/SysWOW64.This ensures that the application behaves as if the DLLs were installed in the System32/SysWOW64 folder. В корне пакета создайте папку с именем VFS.In the root of the package, create a folder called VFS. В этой папке создайте папки SystemX64 и SystemX86.Inside that folder create a SystemX64 and SystemX86 folder. Затем поместите 32-разрядную версию DLL-файла в папку SystemX86, а 64-разрядную версию — в папку SystemX64.Then, place the 32-bit version of your DLL in the SystemX86 folder, and place the 64-bit version in the SystemX64 folder.

  • Ваше приложение использует пакет платформы VCLibs.Your app uses a VCLibs framework package. Для преобразования приложения Win32 на C++ необходимо развернуть среду выполнения Visual C++.If you are converting a C++ Win32 app, you must handle the deployment of the Visual C++ Runtime. Visual Studio 2019 и Windows SDK включают в себя самые новые пакеты платформы для версии 11.0, 12.0 и 14.0 среды выполнения Visual C++ в следующих папках.Visual Studio 2019 and the Windows SDK include the latest framework packages for version 11.0, 12.0 and 14.0 of the Visual C++ Runtime in the following folders:

    • Пакеты платформы VC 14.0: C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop\14.0.VC 14.0 framework packages: C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop\14.0

    • Пакеты платформы VC 12.0: C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.120\14.0.VC 12.0 framework packages: C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.120\14.0

    • Пакеты платформы VC 11.0: C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.110\14.0.VC 11.0 framework packages: C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.110\14.0

    Чтобы использовать один из этих пакетов, необходимо сослаться на него как на зависимость в манифесте пакета.To use one of these packages, you must reference the package as a dependency in your package manifest. Когда пользователи будут устанавливать розничную версию приложения из Microsoft Store, пакет будет устанавливаться из Store вместе с приложением.When customers install the retail version of your app from the Microsoft Store, the package will be installed from the Store along with your app. При загрузке приложения зависимости не будут установлены.The dependencies will not get installed if you side load your app. Чтобы установить зависимости вручную, необходимо установить соответствующий пакет платформы с помощью необходимого пакета APPX для архитектур x86, x64 или ARM в перечисленных выше папках установки.To install the dependencies manually, you must install the appropriate framework package using the appropriate .appx package for x86, x64, or ARM located in the installation folders listed above.

    Чтобы создать ссылку на пакет платформы среды выполнения Visual C++ в приложении, выполните следующее:To reference a Visual C++ Runtime framework package in your app:

    1. Перейдите в папку установки пакета платформы, указанную выше для версии среды выполнения Visual C++, используемой приложением.Go to the framework package install folder listed above for the version of the Visual C++ Runtime used by your app.

    2. Откройте файл SDKManifest.xml в этой папке, перейдите к атрибуту FrameworkIdentity-Debug или FrameworkIdentity-Retail (в зависимости от того, используете вы отладочную или розничную версию среды выполнения) и скопируйте значения Name и MinVersion из этого атрибута.Open the SDKManifest.xml file in that folder, locate the FrameworkIdentity-Debug or FrameworkIdentity-Retail attribute (depending on whether you're using the debug or retail version of the runtime), and copy the Name and MinVersion values from that attribute. Например, ниже приведен атрибут FrameworkIdentity-Retail для текущего пакета платформы VC 14.0.For example, here's the FrameworkIdentity-Retail attribute for the current VC 14.0 framework package.

      FrameworkIdentity-Retail = "Name = Microsoft.VCLibs.140.00.UWPDesktop, MinVersion = 14.0.27323.0, Publisher = 'CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US'"
      
    3. В манифесте пакета приложения добавьте следующий элемент <PackageDependency> в узел <Dependencies>.In the package manifest for your app, add the following <PackageDependency> element under the <Dependencies> node. Обязательно замените значения Name и MinVersion на значения, скопированные на предыдущем шаге.Make sure you replace the Name and MinVersion values with the values you copied in the previous step. В следующем примере задается зависимость для текущей версии пакета платформы VC 14.0:The following example specifies a dependency for the current version of the VC 14.0 framework package.

      <PackageDependency Name="Microsoft.VCLibs.140.00.UWPDesktop" MinVersion="14.0.27323.0" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
      
  • Ваше приложение содержит настраиваемый список переходов.Your application contains a custom jump list. Списки переходов следует использовать с учетом некоторых известных проблем и особенностей.There are several issues and caveats to be aware of when using jump lists.

    • Архитектура вашего приложения не соответствует операционной системе.Your app's architecture does not match the OS. Сейчас списки переходов работают неправильно при несоответствии архитектур приложения и операционной системы (например, при запуске приложения x86 в Windows x64).Jump lists currently do not function correctly if the application and OS architectures do not match (e.g., an x86 application running on x64 Windows). Единственное решение — перекомпиляция приложения в соответствующую архитектуру.At this time, there is no workaround other than to recompile your application to the matching architecture.

    • Ваше приложение создает элементы списка переходов и вызывает ICustomDestinationList::SetAppID или SetCurrentProcessExplicitAppUserModelID .Your application creates jump list entries and calls ICustomDestinationList::SetAppID or SetCurrentProcessExplicitAppUserModelID. Не задавайте свой AppID в коде программными средствами.Do not programmatically set your AppID in code. Это приведет к тому, что элементы списка переходов не будут отображаться.Doing so will cause your jump list entries to not appear. Если вашему приложению требуется пользовательский идентификатор, укажите это с помощью файла манифеста.If your application needs a custom Id, specify it using the manifest file. Инструкции см. в статье об упаковке классических приложений вручную.Refer to Package a desktop application manually for instructions. AppID для вашего приложения указан в разделе YOUR_PRAID_HERE.The AppID for your application is specified in the YOUR_PRAID_HERE section.

    • Ваше приложение добавляет ссылку на оболочку списка переходов, которая ссылается на исполняемый файл в пакете.Your application adds a jump list shell link that references an executable in your package. Напрямую запускать исполняемые файлы в пакете из списка переходов нельзя (за исключением абсолютного пути собственного файла .exe приложения).You cannot directly launch executables in your package from a jump list (with the exception of the absolute path of an app’s own .exe). Вместо этого зарегистрируйте псевдоним выполнения приложения (который позволит вашему упакованному классическому приложению запускаться через ключевое слово, как будто оно находится в PATH) и задайте в качестве целевого пути ссылки путь к этому псевдониму.Instead, register an app execution alias (which allows your packaged desktop application to start via a keyword as though it were on the PATH) and set the link target path to the alias instead. Дополнительные сведения об использовании расширения appExecutionAlias см. в статье Integrate your desktop app with Windows 10 (Интеграция классического приложения с Windows 10).For details on how to use the appExecutionAlias extension, see Integrate your desktop application with Windows 10. Обратите внимание, что если требуется, чтобы ресурсы ссылки в списке переходов совпадали с исходным файлом .exe, необходимо задать ресурсы, такие как значок, используя SetIconLocation, а для отображения имени использовать PKEY_Title, так же, как и для других пользовательских записей.Note that if you require assets of the link in jump list to match the original .exe, you will need to set assets such as the icon using SetIconLocation and the display name with PKEY_Title like you would for other custom entries.

    • Ваше приложение добавляет элементы списка переходов, которые ссылаются на ресурсы в пакете приложения по абсолютному пути.Your application adds a jump list entries that references assets in the app's package by absolute paths. Путь установки приложения может измениться при обновлении пакета, изменении расположения ресурсов (например, значков, документов, исполняемых файлов и т. п.).The installation path of an application may change when its packages are updated, changing the location of assets (such as icons, documents, executable, and so on). Если элементы списка переходов ссылаются на такие ресурсы по абсолютным путям, то приложение должно периодически обновлять свой список переходов (например, при запуске приложения) для обеспечения правильности путей.If jump list entries reference such assets by absolute paths, then the application should refresh its jump list periodically (such as on application launch) to ensure paths resolve correctly. Либо можно использовать API-интерфейсы UWP Windows.UI.StartScreen.JumpList, которые позволяют ссылаться на ресурсы строк и изображений с помощью схемы URI package-relative ms-resource (которая также поддерживает определение языка, DPI и высокой контрастности).Alternatively, use the UWP Windows.UI.StartScreen.JumpList APIs instead, which allow you to reference string and image assets using the package-relative ms-resource URI scheme (which is also language, DPI, and high contrast aware).

  • Для выполнения задач приложение запускает служебную программу.Your application starts a utility to perform tasks. Избегайте запуска служебных программ командной строки, таких как PowerShell и Cmd.exe.Avoid starting command utilities such as PowerShell and Cmd.exe. Фактически, если пользователи устанавливают ваше приложение в системе под управлением Windows 10 S, то в дальнейшем ваше приложение не сможет запустить эти служебные программы вообще.In fact, if users install your application onto a system that runs the Windows 10 S, then your application won’t be able to start them at all. Это может препятствовать отправке вашего приложения в Microsoft Store, так как все приложения, отправляемые туда, должны быть совместимы с Windows 10 S.This could block your application from submission to the Microsoft Store because all apps submitted to the Microsoft Store must be compatible with Windows 10 S.

    Служебные программы часто предоставляют удобный способ для получения информации из операционной системы, доступа к реестру или к возможностям системы.Starting a utility can often provide a convenient way to obtain information from the operating system, access the registry, or access system capabilities. Однако для выполнения такого рода задач можно использовать API UWP.However, you can use UWP APIs to accomplish these sorts of tasks instead. Эти интерфейсы более производительны, так как для их запуска не требуется запуск отдельного исполняемого файла, но более важно то, что эти API не позволяют приложениям выходить за пределы пакета.Those APIs are more performant because they don’t need a separate executable to run, but more importantly, they keep the application from reaching outside of the package. Архитектура приложения будет по-прежнему отвечать требованиям к изоляции, доверию и безопасности, которые сопутствуют упакованному приложению, а поведение вашего приложения будет соответствовать поведению, принятому в системах под управлением Windows 10 S.The app’s design stays consistent with the isolation, trust, and security that comes with an application that you've packaged, and your application will behave as expected on systems running Windows 10 S.

  • В приложении размещаются надстройки, подключаемые модули или расширения.Your application hosts add-ins, plug-ins, or extensions. Во многих случаях расширения в стиле COM устанавливаются как расширения с полным доверием, и, скорее всего, они будут работать до тех пор, пока не будут упакованы.In many cases, COM-style extensions will likely continue to work as long as the extension has not been packaged, and it installs as full trust. Это связано с тем, что установщики могут использовать свои возможности полного доверия для изменения реестра и размещения файлов расширений независимо от того, где ваше ведущее приложение должно их находить.That's because those installers can use their full-trust capabilities to modify the registry and place extension files wherever your host application expects to find them.

    Однако если эти расширения упакованы, а затем установлены в виде пакета приложения для Windows, они не будут работать, так как все пакеты (ведущее приложение и расширение) будут изолированы друг от друга.However, if those extensions are packaged, and then installed as a Windows app package, they won't work because each package (the host application and the extension) will be isolated from one another. Подробную информацию о том, как мост для классических приложений изолирует приложения от системы, см. в статье о работе моста для классических приложений.To read more about how applications are isolated from the system, see Behind the scenes of the Desktop Bridge.

    Все приложения и расширения, которые пользователи устанавливают в системе под управлением Windows 10 S, должны устанавливаться в виде пакетов приложений для Windows.All applications and extensions that users install to a system running Windows 10 S must be installed as Windows App packages. Поэтому если вы планируете упаковать ваши расширения или разрешить их упаковку участникам своей команды, подумайте о том, как облегчить обмен данными между пакетом ведущего приложения и любыми пакетами расширений.So if you intend to package your extensions, or you plan to encourage your contributors to package them, consider how you might facilitate communication between the host application package and any extension packages. Вы можете сделать это, например, с помощью службы приложений.One way that you might be able to do this is by using an app service.

  • Приложение создает код.Your application generates code. Приложение может генерировать код, который используется в памяти, но избегайте записи этого кода на диск, так как процесс сертификации приложений для Windows не сможет проверить этот код перед отправкой приложения.Your application can generate code that it consumes in memory, but avoid writing generated code to disk because the Windows App Certification process can't validate that code prior to app submission. Кроме того, приложения, которые записывают код на диск, не будут работать правильно в системах под управлением Windows 10 S. Это может препятствовать отправке вашего приложения в Microsoft Store, так как все приложения, отправляемые туда, должны быть совместимы с Windows 10 S.Also, apps that write code to disk won’t run properly on systems running Windows 10 S. This could block your application from submission to the Microsoft Store because all apps submitted to the Microsoft Store must be compatible with Windows 10 S.

Важно!

После создания пакета приложения для Windows протестируйте свое приложение и убедитесь, что оно работает правильно в системах под управлением Windows 10 S. Все приложения, отправленные в Microsoft Store, должны быть совместимы с Windows 10 S. Несовместимые приложения не принимаются в Store.After you've created your Windows app package, please test your application to ensure that it works correctly on systems that run Windows 10 S. All apps submitted to the Microsoft Store must be compatible with Windows 10 S. Apps that aren't compatible won't be accepted in the store. См. статью Тестирование приложения для Windows на Windows 10 S.See Test your Windows app for Windows 10 S.