Preparación del empaquetado de una aplicación de escritorioPrepare to package a desktop application

En este artículo se enumeran los aspectos que debes tener en cuenta antes de empaquetar una aplicación de escritorio.This article lists the things you need to know before you package your desktop application. Es posible que no tengas que hacer mucho para preparar la aplicación para el proceso de empaquetado, pero si alguno de los siguientes elementos se aplica a la aplicación, tendrás que abordarlo antes del empaquetado.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.

  • La aplicación .NET requiere una versión del .NET Framework anterior a la 4.6.2.Your .NET application requires a version of the .NET Framework earlier than 4.6.2. Si vas a empaquetar una aplicación .NET, se recomienda que la versión de destino de la aplicación sea .NET Framework 4.6.2 o versiones posteriores.If you are packaging a .NET application, we recommend that your application target .NET Framework 4.6.2 or later. La capacidad de instalar y ejecutar aplicaciones de escritorio empaquetadas se presentó por primera vez en Windows 10, versión 1607 (también denominada “actualización de aniversario”) y esta versión del sistema operativo incluye .NET Framework 4.6.2 de manera predeterminada.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. Las versiones posteriores del sistema operativo incluyen versiones posteriores de .NET Framework.Later OS versions include later versions of the .NET Framework. Para obtener una lista completa de las versiones de .NET que se incluyen en las versiones posteriores de Windows 10, consulta este artículo.For a full list of what versions of .NET are included in later versions of Windows 10, see this article.

    Se espera que las versiones de destino de .NET Framework anteriores a la 4.6.2 en aplicaciones de escritorio empaquetadas funcionen en la mayoría de los casos.Targeting versions of the .NET Framework earlier than 4.6.2 in packaged desktop applications is expected to work in most cases. Sin embargo, si la versión de destino es una versión anterior a la 4.6.2, deberás probar por completo la aplicación de escritorio empaquetada antes de distribuirla a los usuarios.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 a 4.6.1: Se espera que las aplicaciones destinadas a estas versiones de .NET Framework se ejecuten sin problemas en la versión 4.6.2 o en versiones posteriores.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. Por lo tanto, estas aplicaciones deben instalarse y ejecutarse sin cambios en Windows 10, versión 1607 o posterior con la versión de .NET Framework que se incluye con el sistema operativo.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 y 3.5: En nuestras pruebas, las aplicaciones de escritorio empaquetadas destinadas a estas versiones de .NET Framework generalmente funcionan, aunque pueden presentar problemas de rendimiento en algunos escenarios.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. Para que estas aplicaciones empaquetadas puedan instalarse y ejecutarse, se debe instalar la característica .NET Framework 3.5 en el equipo de destino (esta característica también incluye .NET Framework 2.0 y 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). También deberás probar estas aplicaciones minuciosamente después de empaquetarlas.You should also test these applications thoroughly after you package them.

  • La aplicación siempre se ejecuta con privilegios de seguridad elevados.Your application always runs with elevated security privileges. La aplicación necesita funcionar mientras se ejecuta como el usuario interactivo.Your application needs to work while running as the interactive user. Los usuarios que instalen la aplicación pueden no ser administradores del sistema, por lo que exigir que la aplicación se ejecute con privilegios elevados significa que no se ejecutará correctamente para los usuarios estándar.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. Si planeas publicar la aplicación en Microsoft Store, las aplicaciones que requieran privilegios elevados para cualquier parte de su funcionalidad no se aceptarán en 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.

  • La aplicación requiere un controlador de modo kernel o un servicio de Windows.Your application requires a kernel-mode driver or a Windows service. MSIX no admite controladores en modo kernel o servicios de Windows que necesiten ejecutarse en una cuenta de sistema.MSIX does not support a kernel-mode driver or a Windows service that needs to run under a system account. En lugar de un servicio de Windows usa una tarea en segundo plano.Instead of a Windows service, use a background task.

  • Los módulos de la aplicación se cargan durante la operación a aquellos procesos que no están en el paquete de la aplicación de Windows.Your app's modules are loaded in-process to processes that are not in your Windows app package. Esto no está permitido, lo que significa que las extensiones en proceso, como extensiones de shell, no se admiten.This isn't permitted, which means that in-process extensions, like shell extensions, aren't supported. Pero si tienes dos aplicaciones en el mismo paquete, puedes realizar la comunicación entre procesos entre ellas.But if you have two apps in the same package, you can do inter-process communication between them.

  • Asegúrate de que las extensiones instaladas por la aplicación se instalarán donde se instaló la aplicación.Ensure that any extensions installed by the application will install where the application is installed. Windows permite a los usuarios y a los administradores de TI cambiar la ubicación de instalación predeterminada de los paquetes.Windows allows users and IT managers to change the default install location for packages. Consulta "Configuración -> Sistema -> Almacenamiento -> Más configuraciones de almacenamiento -> Cambiar la ubicación de almacenamiento del contenido nuevo -> Las nuevas aplicaciones se guardarán en".See "Settings->System->Storage->More Storage Settings-> Change where new content is saved to -> New Apps will save to". Si vas a instalar una extensión con la aplicación, asegúrate de que la extensión no tiene restricciones adicionales con respecto a la carpeta de instalación.If you are installing an extension with your application, make sure that the extension does not have additional installation folder restrictions. Por ejemplo, algunas extensiones pueden deshabilitar la instalación de su extensión en unidades que no son del sistema.For example, some extensions may disable installing their extension to non-system drives. Esto producirá un error 0x80073D01 (ERROR_DEPLOYMENT_BLOCKED_BY_POLICY) si se ha cambiado la ubicación predeterminada.This will result in an error 0x80073D01 (ERROR_DEPLOYMENT_BLOCKED_BY_POLICY) if the default location has been changed.

  • La aplicación usa un identificador del modelo de usuario de la aplicación (AUMID) personalizado.Your application uses a custom Application User Model ID (AUMID). Si el proceso llama a SetCurrentProcessExplicitAppUserModelID para establecer su propio AUMID, entonces solo puede usar el AUMID generado para este por el entorno del modelo de aplicaciones o el paquete de la aplicación de 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. No se pueden definir AUMID personalizados.You can't define custom AUMIDs.

  • La aplicación modifica el subárbol del registro HKEY_LOCAL_MACHINE (HKLM) .Your application modifies the HKEY_LOCAL_MACHINE (HKLM) registry hive. Cualquier intento de tu aplicación para crear una clave HKLM o abrir una para realizar modificaciones producirá un error de acceso denegado.Any attempt by your application to create an HKLM key, or to open one for modification, will result in an access-denied failure. Recuerda que tu aplicación tiene su propia vista virtualizada privada del registro, por lo que no se aplica la noción de un subárbol del registro de nivel de usuario y de equipo (que es lo que HKLM es).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. Necesitas encontrar otra manera de lograr aquello para lo que usaste HKLM, como escribir en HKEY_CURRENT_USER (HKCU) en su lugar.You will need to find another way of achieving what you were using HKLM for, like writing to HKEY_CURRENT_USER (HKCU) instead.

  • La aplicación usa una subclave del registro ddeexec como un mecanismo para iniciar otra aplicación.Your application uses a ddeexec registry subkey as a means of launching another app. En su lugar, usa uno de los controladores de verbo DelegateExecute como lo configuran las distintas extensiones activables* en tu manifiesto del paquete de la aplicación.Instead, use one of the DelegateExecute verb handlers as configured by the various Activatable* extensions in your app package manifest.

  • La aplicación escribe en la carpeta AppData o en el registro con la intención de compartir datos con otra aplicación.Your application writes to the AppData folder or to the registry with the intention of sharing data with another app. Después de la conversión, AppData se redirige al almacén de datos locales de la aplicación, que es un almacén privado para cada aplicación.After conversion, AppData is redirected to the local app data store, which is a private store for each app.

    Todas las entradas que tu aplicación escribe en el subárbol del registro HKEY_LOCAL_MACHINE se redirigen a un archivo binario aislado y las entradas que tu aplicación escribe en el subárbol del registro HKEY_CURRENT_USER se colocan en una ubicación privada por usuario y por aplicación.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. Para obtener más información acerca de la redirección de archivos y del registro, consulta Segundo plano del puente de dispositivo de escritorio.For more details about file and registry redirection, see Behind the scenes of the Desktop Bridge.

    Usa un medio diferente para compartir datos entre procesos.Use a different means of inter-process data sharing. Para obtener más información, consulta Almacenar y recuperar la configuración y otros datos de aplicación.For more info, see Store and retrieve settings and other app data.

  • La aplicación escribe en el directorio de instalación de la aplicación.Your application writes to the install directory for your app. Por ejemplo, la aplicación escribe en un archivo de registro que se coloca en el mismo directorio que el archivo .exe.For example, your application writes to a log file that you put in the same directory as your exe. Esto no se admite, por lo que tendrás que buscar otra ubicación, como el almacén de datos locales de la aplicación.This isn't supported, so you'll need to find another location, like the local app data store.

  • La aplicación usa el directorio de trabajo actual.Your application uses the current working directory. En tiempo de ejecución, la aplicación de escritorio empaquetada no obtendrá el mismo directorio de trabajo que especificaste anteriormente en el acceso directo .LNK del escritorio.At runtime, your packaged desktop application won't get the same working directory that you previously specified in your desktop .LNK shortcut. Debes cambiar tu CWD en tiempo de ejecución si tener el directorio correcto es importante para que tu aplicación funcione correctamente.You need to change your CWD at runtime if having the correct directory is important for your application to function correctly.

    Nota

    Si la aplicación necesita escribir en el directorio de instalación o usar el directorio de trabajo actual, también puedes considerar la posibilidad de agregar una corrección en tiempo de ejecución mediante la Plataforma de compatibilidad de paquetes al paquete.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. Para obtener más información, consulta este artículo.For more details, see this article.

  • La instalación de la aplicación requiere la interacción del usuario.Your application installation requires user interaction. El instalador de la aplicación debe ser capaz de ejecutarse de forma silenciosa e instalar todos los requisitos previos que no estén activados de forma predeterminada en una imagen limpia del sistema operativo.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.

  • La aplicación requiere UIAccess.Your application requires UIAccess. Si la aplicación especifica UIAccess=true en el elemento requestedExecutionLevel del manifiesto de UAC, la conversión a MSIX no es compatible actualmente.If your application specifies UIAccess=true in the requestedExecutionLevel element of the UAC manifest, conversion to MSIX isn't supported currently. Para más información, consulta UI Automation Security Overview (Introducción a la seguridad de la automatización de la interfaz de usuario).For more info, see UI Automation Security Overview.

  • La aplicación expone objetos COM.Your application exposes COM objects. Los procesos y extensiones del paquete se pueden registrar y usar como servidores COM y OLE; asimismo, ambos pueden estar tanto dentro como fuera del proceso (OOP).Processes and extensions from within the package can register and use COM & OLE servers, both in-process and out-of-process (OOP). La actualización de creadores agrega la compatibilidad con Packaged COM, que proporciona la capacidad de registrar los servidores OOP COM y OLE que ahora están visibles fuera del paquete.The Creators Update adds Packaged COM support which provides the ability to register OOP COM & OLE servers that are now visible outside the package. Consulta Compatibilidad del servidor COM y del documento OLE con el Puente de dispositivo de escritorio.See COM Server and OLE Document support for Desktop Bridge.

    La compatibilidad con Packaged COM funciona con las API de COM existentes, pero no con aquellas extensiones de aplicación que dependen de la lectura directa del registro, ya que la ubicación de Packaged COM es privada.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.

  • La aplicación expone ensamblados GAC para que los usen otros procesos.Your application exposes GAC assemblies for use by other processes. La aplicación no puede exponer ensamblados GAC para que los usen procesos originados desde archivos ejecutables externos en el paquete de la aplicación de Windows.Your application cannot expose GAC assemblies for use by processes originating from executables external to your Windows app package. Los procesos internos del paquete pueden registrar y usar ensamblados GAC del modo habitual, pero no serán visibles externamente.Processes from within the package can register and use GAC assemblies as normal, but they will not be visible externally. Esto significa que los escenarios de interoperabilidad como OLE no funcionarán si los invocan procesos externos.This means interop scenarios like OLE will not function if invoked by external processes.

  • La aplicación está vinculando las bibliotecas en tiempo de ejecución de C (CRT) de forma no admitida.Your application is linking C runtime libraries (CRT) in an unsupported manner. La biblioteca en tiempo de ejecución de Microsoft C/C++ ofrece rutinas de programación para el sistema operativo Microsoft Windows.The Microsoft C/C++ runtime library provides routines for programming for the Microsoft Windows operating system. Estas rutinas automatizan muchas tareas comunes de programación que no proporcionan los lenguajes C y C++.These routines automate many common programming tasks that are not provided by the C and C++ languages. Si la aplicación usa la biblioteca en tiempo de ejecución de C o C++, debes asegurarte de que esté vinculada de manera admitida.If your application utilizes C/C++ runtime library, you need to ensure it is linked in a supported manner.

    Visual Studio 2017 admite tanto la vinculación dinámica y estática, para permitir que el código use los archivos DLL comunes, como la vinculación estática, para vincular la biblioteca directamente en el código a la versión actual de 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. Si es posible, se recomienda que la aplicación use la vinculación dinámica con VS 2017.If possible, we recommend your application use dynamic linking with VS 2017.

    La compatibilidad en versiones anteriores de Visual Studio varía.Support in previous versions of Visual Studio varies. Consulta la tabla siguiente para obtener más información:See the following table for details:

    Versión de Visual StudioVisual Studio versionVinculación dinámicaDynamic linkingVinculación estáticaStatic linking
    2005 (VC 8)2005 (VC 8)IncompatibleNot supportedCompatibleSupported
    2008 (VC 9)2008 (VC 9)IncompatibleNot supportedCompatibleSupported
    2010 (VC 10)2010 (VC 10)CompatibleSupportedCompatibleSupported
    2012 (VC 11)2012 (VC 11)CompatibleSupportedIncompatibleNot supported
    2013 (VC 12)2013 (VC 12)CompatibleSupportedIncompatibleNot supported
    2015 y 2017 (VC 14)2015 and 2017 (VC 14)CompatibleSupportedCompatibleSupported

    Nota: En todos los casos, debes realizar la vinculación a la última versión de CRT disponible públicamente.Note: In all cases, you must link to the latest publicly available CRT.

  • La aplicación se instala y carga los ensamblados desde la carpeta de Windows en paralelo.Your application installs and loads assemblies from the Windows side-by-side folder. Por ejemplo, la aplicación usa las bibliotecas en tiempo de ejecución de C VC8 o VC9 y las vincula de forma dinámica desde la carpeta de Windows en paralelo, lo que significa que el código usa los archivos DLL comunes de una carpeta compartida.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. Esto no se admite.This is not supported. Deberás vincularlas de forma estática mediante la vinculación a los archivos de biblioteca redistribuibles directamente en el código.You will need to statically link them by linking to the redistributable library files directly into your code.

  • La aplicación usa una dependencia en la carpeta System32/SysWOW64.Your application uses a dependency in the System32/SysWOW64 folder. Para que las DLL funcionen, debes incluirlas en la parte del sistema de archivos virtual del paquete de la aplicación de Windows.To get these DLLs to work, you must include them in the virtual file system portion of your Windows app package. Esto garantiza que la aplicación se comporte como si las DLL se hubieran instalado en la carpeta System32/SysWOW64.This ensures that the application behaves as if the DLLs were installed in the System32/SysWOW64 folder. En la raíz del paquete, crea una carpeta denominada VFS.In the root of the package, create a folder called VFS. Dentro de esa carpeta, crear una carpeta SystemX64 y otra SystemX86.Inside that folder create a SystemX64 and SystemX86 folder. A continuación, pon la versión de 32 bits de la DLL en la carpeta SystemX86 y coloca la versión de 64 bits en la carpeta SystemX64.Then, place the 32-bit version of your DLL in the SystemX86 folder, and place the 64-bit version in the SystemX64 folder.

  • La aplicación usa un paquete de marcos de VCLibs.Your app uses a VCLibs framework package. Si vas a convertir una aplicación Win32 de C++, debes controlar la implementación del entorno de ejecución de Visual C++.If you are converting a C++ Win32 app, you must handle the deployment of the Visual C++ Runtime. Visual Studio 2019 y Windows SDK incluyen los paquetes de marcos más recientes para la versión 11.0, 12.0 y 14.0 del entorno de ejecución de Visual C++ en las siguientes carpetas: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:

    • Paquetes de marcos de VC 14.0: C:\Archivos de programa (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop\14.0VC 14.0 framework packages: C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop\14.0

    • Paquetes de marcos de VC 12.0: C:\Archivos de programa (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.120\14.0VC 12.0 framework packages: C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.120\14.0

    • Paquetes de marcos de VC 11.0: C:\Archivos de programa (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.110\14.0VC 11.0 framework packages: C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.110\14.0

    Para usar uno de estos paquetes, debes hacer referencia al paquete como una dependencia en el manifiesto del paquete.To use one of these packages, you must reference the package as a dependency in your package manifest. Cuando los clientes instalen la versión comercial de la aplicación desde Microsoft Store, el paquete se instalará desde Store junto con la aplicación.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. Las dependencias no se instalarán si realizas una instalación de prueba de la aplicación.The dependencies will not get installed if you side load your app. Para instalar las dependencias manualmente, debes instalar el paquete de marcos adecuado mediante el paquete .appx correspondiente para x86, x64 o ARM, que se encuentra en las carpetas de instalación mencionadas anteriormente.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.

    Para hacer referencia a un paquete de marcos del entorno de ejecución de Visual C++ en la aplicación:To reference a Visual C++ Runtime framework package in your app:

    1. Ve a la carpeta de instalación del paquete de marcos indicada anteriormente para la versión del entorno de ejecución de Visual C++ que la aplicación utiliza.Go to the framework package install folder listed above for the version of the Visual C++ Runtime used by your app.

    2. Abre el archivo SDKManifest.xml de esa carpeta, busca el atributo FrameworkIdentity-Debug o FrameworkIdentity-Retail (en función de si estás usando la versión de depuración o comercial del entorno de ejecución) y copia los valores Name y MinVersion de ese atributo.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. Por ejemplo, este es el atributo FrameworkIdentity-Retail para el paquete de marcos actual de 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. En el manifiesto del paquete de la aplicación, agrega el siguiente elemento <PackageDependency> en el nodo <Dependencies>.In the package manifest for your app, add the following <PackageDependency> element under the <Dependencies> node. Asegúrate de reemplazar los valores Name y MinVersion por los valores que copiaste en el paso anterior.Make sure you replace the Name and MinVersion values with the values you copied in the previous step. En el siguiente ejemplo se especifica una dependencia para la versión actual del paquete de marcos de 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" />
      
  • La aplicación contiene una lista de accesos directos personalizada.Your application contains a custom jump list. Hay varios problemas y advertencias que se deben tener en cuenta al usar las listas de accesos directos.There are several issues and caveats to be aware of when using jump lists.

    • La arquitectura de tu aplicación no coincide con el sistema operativo.Your app's architecture does not match the OS. Actualmente, las listas de accesos directos no funcionan correctamente si las arquitecturas de la aplicación y del sistema operativo no coinciden (por ejemplo, una aplicación x86 que se ejecuta en 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). En este momento, no existe ninguna solución alternativa que no sea la de volver a compilar la aplicación con la arquitectura coincidente.At this time, there is no workaround other than to recompile your application to the matching architecture.

    • La aplicación crea entradas de lista de accesos directos y llama a ICustomDestinationList::SetAppID o SetCurrentProcessExplicitAppUserModelID .Your application creates jump list entries and calls ICustomDestinationList::SetAppID or SetCurrentProcessExplicitAppUserModelID. No establezcas mediante programación el AppID en el código.Do not programmatically set your AppID in code. Si lo haces, hará que las entradas de la lista de accesos directos no aparezcan.Doing so will cause your jump list entries to not appear. Si la aplicación necesita un identificador personalizado, especifícalo mediante el archivo de manifiesto.If your application needs a custom Id, specify it using the manifest file. Consulta Empaquetado manual de una aplicación de escritorio para obtener instrucciones.Refer to Package a desktop application manually for instructions. El AppID de la aplicación se especifica en la sección YOUR_PRAID_HERE.The AppID for your application is specified in the YOUR_PRAID_HERE section.

    • La aplicación agrega un vínculo de shell de lista de accesos directos que hace referencia a un ejecutable del paquete.Your application adds a jump list shell link that references an executable in your package. No puedes iniciar ejecutables directamente en el paquete de una lista de accesos directos (a excepción de la ruta de acceso absoluta del propio .exe de una aplicación).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). En su lugar, registra un alias de ejecución de la aplicación (que permite que la aplicación de escritorio empaquetada se inicie a través de una palabra clave como si estuviera en PATH) y establece la ruta de acceso de destino del vínculo en el alias en su lugar.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. Para obtener más información sobre cómo usar la extensión appExecutionAlias, consulta Integración de aplicaciones de escritorio con Windows 10 .For details on how to use the appExecutionAlias extension, see Integrate your desktop application with Windows 10. Ten en cuenta que si necesitas que los recursos del vínculo de la lista de accesos directos coincida con el .exe original, tendrás que establecer recursos como el icono con SetIconLocation y el nombre para mostrar con PKEY_Title igual que harías para otras entradas personalizadas.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.

    • La aplicación agrega entradas de lista de accesos directos que hacen referencia a recursos del paquete de la aplicación mediante rutas de acceso absolutas.Your application adds a jump list entries that references assets in the app's package by absolute paths. La ruta de instalación de una aplicación puede cambiar cuando se actualizan sus paquetes, cambiando la ubicación de los recursos (como iconos, documentos, ejecutables, etcétera).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). Si las entradas de la lista de accesos directos hacen referencia a estos recursos mediante rutas de acceso absolutas, la aplicación debe actualizar periódicamente su lista de accesos directos (por ejemplo, al iniciar la aplicación) para garantizar que las rutas de acceso se resuelven correctamente.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. Como alternativa, usa las API Windows.UI.StartScreen.JumpList de UWP en su lugar, que permiten hacer referencia a los recursos de imagen y cadena con el esquema URI de ms-resource relativo del paquete (que también reconoce el idioma, PPP y contraste alto).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).

  • La aplicación inicia una utilidad para realizar tareas.Your application starts a utility to perform tasks. Evita iniciar utilidades de comando como PowerShell y Cmd.exe.Avoid starting command utilities such as PowerShell and Cmd.exe. De hecho, si los usuarios instalan la aplicación en un sistema que ejecuta Windows 10 S, la aplicación no podrá iniciar estas utilidades.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. Esto podría impedir que la aplicación se envíe a Microsoft Store, ya que todas las aplicaciones enviadas a Microsoft Store deben ser compatibles con 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.

    A menudo, iniciar una utilidad puede constituir una forma sencilla de conseguir información del sistema operativo, acceder al registro o acceder a las funcionalidades del sistema.Starting a utility can often provide a convenient way to obtain information from the operating system, access the registry, or access system capabilities. Sin embargo, puedes usar las API de UWP para realizar este tipo de tareas en su lugar.However, you can use UWP APIs to accomplish these sorts of tasks instead. Estas API son más eficaces porque no necesitan usar un archivo ejecutable independiente y, aún mejor, evitan que la aplicación salga del paquete.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. El diseño de la aplicación mantiene su coherencia gracias al aislamiento, confiabilidad y seguridad que proporciona una aplicación que ha empaquetado, por lo que la aplicación se comportará según lo esperado en aquellos sistemas que ejecuten 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.

  • La aplicación contiene complementos, módulos o extensiones.Your application hosts add-ins, plug-ins, or extensions. En muchos casos, las extensiones de estilo COM siguen funcionando siempre y cuando la extensión no se haya empaquetado y se instale como extensión de plena confianza.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. Esto es debido a que los instaladores pueden usar las funcionalidades de plena confianza para modificar el registro y colocar archivos de extensión donde se espera que la aplicación host los encuentre.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.

    Sin embargo, si las extensiones se empaquetan y se instalan como un paquete de aplicación de Windows, no funcionarán porque los paquetes (formados por la aplicación host y la extensión) estarán aislados entre sí.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. Para leer más acerca de cómo las aplicaciones se aíslan del sistema, consulta Segundo plano del puente de dispositivo de escritorio.To read more about how applications are isolated from the system, see Behind the scenes of the Desktop Bridge.

    Todas las aplicaciones y extensiones que instalen los usuarios en un sistema que ejecute Windows 10 S deben instalarse como paquetes de aplicación de Windows.All applications and extensions that users install to a system running Windows 10 S must be installed as Windows App packages. Por lo tanto, si vas a empaquetar las extensiones o tienes previsto animar a tus colaboradores a empaquetarlas, ten en cuenta el modo de facilitar la comunicación entre el paquete de la aplicación host y los paquetes de la extensión.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. Una solución que puedes plantear es usar un servicio de aplicación.One way that you might be able to do this is by using an app service.

  • La aplicación genera código.Your application generates code. La aplicación puede generar código que consume en la memoria, pero evita escribir código generado en el disco, debido a que el proceso de certificación de aplicaciones de Windows no puede validar el código antes de enviar la aplicación.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. Además, las aplicaciones que escriben código en el disco no se ejecutarán correctamente en sistemas que ejecutan Windows 10 S. Esto podría impedir que la aplicación se envíe a Microsoft Store, ya que todas las aplicaciones enviadas a Microsoft Store deben ser compatibles con 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.

Importante

Una vez que hayas creado el paquete de la aplicación de Windows, prueba tu aplicación para garantizar que funcione correctamente en sistemas que ejecutan Windows 10 S. Todas las aplicaciones enviadas a Microsoft Store deben ser compatibles con aplicaciones de Windows 10 S. Las aplicaciones que no sean compatibles no se aceptarán en Microsoft 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. Consulta Probar la aplicación de Windows en Windows 10 S.See Test your Windows app for Windows 10 S.