Marco de compatibilidad de paquetes: corrección del directorio de trabajo

Investigación

Las aplicaciones de Windows redirigirán directorios específicos relacionados con la aplicación a la carpeta C:\Program Files\WindowsApps. Si una aplicación crea una subcarpeta (C:\Program Files\Vendor\subfolder) como parte de la instalación y, posteriormente, llama a esta subcarpeta, no podrá encontrar el directorio ya que no existe.

Con el marco de compatibilidad de paquetes (PSF), se pueden realizar mejoras en el paquete de la aplicación de Windows para resolver este problema. En primer lugar, debemos identificar los errores y las rutas de acceso de directorio que solicita la aplicación.

Captura del error de la aplicación de Windows

El filtrado de los resultados es un paso opcional que facilitará la visualización de errores relacionados con la aplicación. Para ello, crearemos dos reglas de filtro. El primero es un filtro de inclusión para el nombre del proceso de aplicación y el segundo es una inclusión de los resultados que no se realizan correctamente.

  1. Descarga y extrae el Monitor de procesos de SysInternals en el directorio C:\PSF\ProcessMonitor.
  2. Abre el Explorador de Windows y ve a la carpeta Process Monitor de SysInternals extraída
  3. Haz doble clic en el archivo Process Monitor de SysInternals (procmon.exe), iniciando la aplicación.
  4. Si UAC lo solicita, selecciona el botón .
  5. En la ventana Filtro del Monitor de procesos, selecciona el primer menú desplegable etiquetado con Arquitectura.
  6. Selecciona Nombre de proceso en el menú desplegable.
  7. En el siguiente menú desplegable, comprueba que se establece con el valor de is.
  8. En el campo de texto, escribe el nombre del proceso de la aplicación (ejemplo: PSFSample.exe). Example of the Process Monitor Filter Windows with App Name
  9. Seleccione el botón Agregar.
  10. En la ventana Filtro del Monitor de procesos, selecciona el primer menú desplegable con la etiqueta Nombre del proceso.
  11. Selecciona Resultado en el menú desplegable.
  12. En el menú desplegable siguiente, selecciónalo y selecciona is not en el menú desplegable.
  13. En el campo de texto, escribe SUCCESS. Example of the Process Monitor Filter Windows with Result
  14. Seleccione el botón Agregar.
  15. Seleccione el botón Aceptar.
  16. Inicia la aplicación de Windows, desencadena el error y, después, cierra la aplicación de Windows.

Revisión de los registros de errores de la aplicación de Windows

Después de capturar los procesos de la aplicación de Windows, los resultados deberán investigarse para identificar si el error está relacionado con el directorio de trabajo.

  1. Revisa los resultados de Process Monitor de SysInternals y busca los errores descritos en la tabla anterior.
  2. Si los resultados muestran un resultado "Nombre no encontrado", con los detalles "Acceso deseado: ..." para la aplicación específica destinada a un directorio fuera de "C:\Archivos de programa\WindowsApps\...\" (como se muestra en la imagen siguiente), has identificado correctamente un error relacionado con el directorio de trabajo, usa el artículo Soporte técnico de PSF: Acceso al sistema de archivos para obtener instrucciones sobre cómo aplicar la corrección de PSF a la aplicación. Displays the error message witnessed in the SysInternals Process Monitor for failure to write to directory.

Solución

Las aplicaciones de Windows redirigirán directorios específicos relacionados con la aplicación a la carpeta C:\Program Files\WindowsApps. Si una aplicación crea una subcarpeta (C:\Program Files\Vendor\subfolder) como parte de la instalación y, posteriormente, llama a esta subcarpeta, no podrá encontrar el directorio ya que no existe.

Para resolver el problema relacionado con la aplicación de Windows que hace referencia a un directorio de trabajo incorrecto, debemos seguir los cuatro pasos siguientes:

  1. Almacenar provisionalmente la aplicación de Windows en un directorio local
  2. Crear el archivo config.json e insertar los archivos PSF necesarios
  3. Actualizar el archivo AppxManifest de la aplicación de Windows
  4. Vuelve a empaquetar y firma la aplicación de Windows

Los pasos anteriores proporcionan instrucciones acerca de la extracción del contenido de la aplicación de Windows en un directorio preconfigurado local, la inserción de los archivos de corrección de PSF en el directorio de aplicaciones de Windows preconfigurado, la configuración del iniciador de la aplicación para que apunte al iniciador de PSF y, a continuación, configurar el archivo config.json de PSF para redirigir el iniciador de PSF a la aplicación que especifica el directorio de trabajo.

Descarga e Instalación de las herramientas necesarias

Este proceso le guiará durante el proceso de recuperación y uso de las siguientes herramientas:

  • Herramienta de Cliente de NuGet
  • Marco de compatibilidad de paquete
  • SDK de Windows 10 (versión más reciente)
  • Process Monitor de SysInternals

A continuación se proporcionan instrucciones paso a paso sobre cómo descargar e instalar las herramientas necesarias.

  1. Descarga la versión más reciente (no preliminar) de la herramienta de cliente de NuGet y guarda nuget.exe en la carpeta C:\PSF\nuget.

  2. Descarga el marco de compatibilidad de paquetes mediante Nuget con la ejecución de lo siguiente desde una ventana de PowerShell administrativa:

    Set-Location "C:\PSF"
    .\nuget\nuget.exe install Microsoft.PackageSupportFramework
    
  3. Descarga e instale el Kit de herramientas de desarrollo de software de Windows 10 (SDK de Win 10).

    1. Descarga el SDK de Win 10.
    2. Ejecuta el winsdksetup.exe que te descargaste en el paso anterior.
    3. Haga clic en el botón Siguiente.
    4. Selecciona solo las tres características siguientes para la instalación:
      • Herramientas de firma de Windows SDK para aplicaciones de escritorio
      • Windows SDK para aplicaciones de C++ para UWP
      • Localización del SDK de Windows para aplicaciones para UWP
    5. Seleccione el botón Instalar.
    6. Seleccione el botón Aceptar.

Almacenamiento provisional de la aplicación de Windows

Al almacenar provisionalmente la aplicación de Windows, se extraerá o desempaquetará el contenido de la aplicación de Windows en un directorio local. Una vez que la aplicación de Windows se ha desempaquetado en la ubicación de almacenamiento provisional, puedes insertar archivos de corrección de PSF para corregir cualquier experiencia no deseada.

  1. Abre una ventana administrativa de PowerShell.

  2. Establece las siguientes variables que tienen como destino el archivo de aplicación específico y la versión del SDK de Windows 10:

    $AppPath          = "C:\PSF\SourceApp\PSFSampleApp.msix"         ## Path to the MSIX App Installer
    $StagingFolder    = "C:\PSF\Staging\PSFSampleApp"                ## Path to where the MSIX App will be staged
    $OSArchitecture   = "x$((gwmi Win32_Processor).AddressWidth)"    ## Operating System Architecture
    $Win10SDKVersion  = "10.0.19041.0"                               ## Latest version of the Win10 SDK
    
  3. Desempaqueta la aplicación de Windows en la carpeta de almacenamiento provisional mediante la ejecución del siguiente cmdlet de PowerShell:

    ## Sets the directory to the Windows 10 SDK
    Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture"
    
    ## Unpackages the Windows app to the staging folder
    .\makeappx.exe unpack /p "$AppPath" /d "$StagingFolder"
    

Creación e inserción de los Archivos PSF necesarios

Para aplicar acciones correctivas a la aplicación de Windows, debes crear un archivo config.json y proporcionarle información sobre el iniciador de aplicaciones de Windows que produce un error. Si hay varios iniciadores de aplicaciones de Windows que experimentan problemas, entonces el archivo config.json se puede actualizar con varias entradas.

Después de actualizar el archivo config.json, el archivo config.json y los archivos de corrección de PSF compatibles deben moverse a la raíz del paquete de la aplicación de Windows.

  1. Abre Visual Studio Code (VS Code) o cualquier otro editor de texto.

  2. Crea un nuevo archivo; para ello, selecciona el menú Archivo en la parte superior de VS Code y selecciona Nuevo archivo en el menú desplegable.

  3. Guarda el archivo como config.json; para ello, selecciona el menú Archivo en la parte superior de la ventana de VS Code y selecciona Guardar en el menú desplegable. En la ventana Guardar como, ve al directorio de almacenamiento provisional de la aplicación de Windows (C:\PSF\Staging\PSFSampleApp) y establece el Nombre de archivo como config.json. Seleccione el botón Guardar.

  4. Copia el siguiente código en el archivo config.json recién creado.

    {
        "applications": [
            {
                "id": "",
                "executable": "",
                "workingDirectory": ""
            }
        ],
        "processes": [
            {
                "executable": ""
            }
        ]
    }
    
  5. Abre el archivo AppxManifest de la aplicación de Windows almacenado provisionalmente en la carpeta de almacenamiento provisional de la aplicación de Windows (C:\PSF\Staging\PSFSampleApp\AppxManifest.xml) mediante VS Code u otro editor de texto.

    <Applications>
        <Application Id="PSFSAMPLE" Executable="VFS\ProgramFilesX64\PS Sample App\PSFSample.exe" EntryPoint="Windows.FullTrustApplication">
        <uap:VisualElements BackgroundColor="transparent" DisplayName="PSFSample" Square150x150Logo="Assets\StoreLogo.png" Square44x44Logo="Assets\StoreLogo.png" Description="PSFSample">
            <uap:DefaultTile Wide310x150Logo="Assets\StoreLogo.png" Square310x310Logo="Assets\StoreLogo.png" Square71x71Logo="Assets\StoreLogo.png" />
        </uap:VisualElements>
        </Application>
    </Applications>
    
  6. Copia el valor en el campo ID ubicado en el archivo AppxManifest.xml ubicado en Package.Applications.Application en el campo Id. de aplicaciones del archivo config.json. Image circling the location of the ID within the AppxManifest file.

  7. Copia la ruta de acceso relativa al paquete desde el campo Ejecutable ubicado en el archivo AppxManifest.xml situado en Package.Applications.Application al campo Ejecutable de las aplicaciones en el archivo config.json. Image circling the location of the executable within the AppxManifest file.

  8. Copia la ruta de acceso primaria relativa al paquete desde el campo Ejecutable ubicado en el archivo AppxManifest.xml situado en Package.Applications.Application al campo Directorio de trabajo de aplicaciones en el archivo config.json. Image circling the location of the working directory within the AppxManifest file.

  9. Copia el nombre ejecutable del campo Ejecutable ubicado en el archivo AppxManifest.xml ubicado en Package.Applications.Application en el campo Ejecutable de procesos del archivo config.json. Image circling the location of the process executable within the AppxManifest file.

  10. Guarda el archivo config.json actualizado.

    {
        "applications": [
            {
            "id": "PSFSample",
            "executable": "VFS/ProgramFilesX64/PS Sample App/PSFSample.exe",
            "workingDirectory": "VFS/ProgramFilesX64/PS Sample App/"
            }
        ],
        "processes": [
            {
            "executable": "PSFSample"
            }
        ]
    }
    
  11. Copia los tres archivos siguientes del marco de compatibilidad de paquetes en función de la arquitectura ejecutable de la aplicación en la raíz de la aplicación de Windows almacenada provisionalmente. Los siguientes archivos se encuentran en .\Microsoft.PackageSupportFramework.<Version>\bin.

    Aplicación (x64) Aplicación (x86)
    PSFLauncher64.exe PSFLauncher32.exe
    PSFRuntime64.dll PSFRuntime32.dll
    PSFRunDll64.exe PSFRunDll32.exe

Actualización de AppxManifest

Después de crear y actualizar el archivo config.json, el archivo AppxManifest.xml de la aplicación de Windows debe actualizarse para cada iniciador de aplicaciones de Windows que se incluyó en el archivo config.json. Las aplicaciones de AppxManifest ahora deben tener como destino el PSFLauncher.exe asociado a la arquitectura de aplicaciones.

  1. Abre el Explorador de archivos y ve a la carpeta de la Aplicación MSIX de almacenamiento provisional (C:\PSF\Staging\PSFSampleApp).

  2. Haz clic con el botón derecho en AppxManifest.xml y selecciona Abrir con Code en el menú desplegable (Opcionalmente, puedes abrirlo con otro editor de texto).

  3. Actualiza el archivo AppxManifest.xml con la siguiente información:

    <Package ...>
    ...
    <Applications>
        <Application Id="PSFSample"
                    Executable="PSFLauncher32.exe"
                    EntryPoint="Windows.FullTrustApplication">
        ...
        </Application>
    </Applications>
    </Package>
    

Volver a empaquetar la aplicación

Se han aplicado todas las correcciones, ahora la aplicación de Windows se puede volver a empaquetar en MSIX y firmarse mediante un certificado de firma de código.

  1. Abre una Ventana administrativa de PowerShell.

  2. Configure las siguientes variables:

    $AppPath          = "C:\PSF\SourceApp\PSFSampleApp_Updated.msix" ## Path to the MSIX App Installer
    $CodeSigningCert  = "C:\PSF\Cert\CodeSigningCertificate.pfx"     ## Path to your code signing certificate
    $CodeSigningPass  = "<Password>"                                 ## Password used by the code signing certificate
    $StagingFolder    = "C:\PSF\Staging\PSFSampleApp"                ## Path to where the MSIX App will be staged
    $OSArchitecture   = "x$((gwmi Win32_Processor).AddressWidth)"    ## Operating System Architecture
    $Win10SDKVersion  = "10.0.19041.0"                               ## Latest version of the Win10 SDK
    
  3. Vuelve a empaquetar la aplicación de Windows desde la carpeta de almacenamiento provisional mediante la ejecución del siguiente cmdlet de PowerShell:

    Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture"
    .\makeappx.exe pack /p "$AppPath" /d "$StagingFolder"
    
  4. Ejecuta el siguiente cmdlet de PowerShell para firmar la aplicación de Windows:

    Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture"
    .\signtool.exe sign /v /fd sha256 /f $CodeSigningCert /p $CodeSigningPass $AppPath