Creare una correzione del Package Support FrameworkCreate a Package Support Framework fixup

Se non è presente alcuna correzione del runtime per il problema, è possibile creare una nuova correzione di runtime scrivendo funzioni di sostituzione e includendo tutti i dati di configurazione sensati.If there is no runtime fix for your issue, you can create a new runtime fix by writing replacement functions and including any configuration data that makes sense. Esaminiamo ogni parte.Let's look at each part.

Funzioni di sostituzioneReplacement functions

Per prima cosa, identificare le chiamate di funzione non riuscite quando l'applicazione viene eseguita in un contenitore MSIX.First, identify which function calls fail when your application runs in an MSIX container. Quindi, devi creare funzioni sostitutive da far chiamare dal gestore runtime.Then, you can create replacement functions that you'd like the runtime manager to call instead. Questo offre la possibilità di sostituire l'implementazione di una funzione con un comportamento conforme alle regole dell'ambiente di runtime moderno.This gives you an opportunity to replace the implementation of a function with behavior that conforms to the rules of the modern runtime environment.

Dichiarare la FIXUP_DEFINE_EXPORTS macro e quindi aggiungere un'istruzione di inclusione per l'oggetto fixup_framework.h all'inizio di ogni. File CPP in cui si intende aggiungere le funzioni della correzione del runtime.Declare the FIXUP_DEFINE_EXPORTS macro and then add a include statement for the fixup_framework.h at the top of each .CPP file where you intend to add the functions of your runtime fix.

#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>

Importante

Assicurarsi che la FIXUP_DEFINE_EXPORTS macro venga visualizzata prima dell'istruzione include.Make sure that the FIXUP_DEFINE_EXPORTS macro appears before the include statement.

Creare una funzione con la stessa firma della funzione di cui si vuole modificare il comportamento.Create a function that has the same signature of the function who's behavior you want to modify. Di seguito è riportato un esempio di funzione che sostituisce la MessageBoxW funzione.Here's an example function that replaces the MessageBoxW function.

auto MessageBoxWImpl = &::MessageBoxW;
int WINAPI MessageBoxWFixup(
    _In_opt_ HWND hwnd,
    _In_opt_ LPCWSTR,
    _In_opt_ LPCWSTR caption,
    _In_ UINT type)
{
    return MessageBoxWImpl(hwnd, L"SUCCESS: This worked", caption, type);
}

DECLARE_FIXUP(MessageBoxWImpl, MessageBoxWFixup);

La chiamata a DECLARE_FIXUP esegue il mapping della MessageBoxW funzione alla nuova funzione di sostituzione.The call to DECLARE_FIXUP maps the MessageBoxW function to your new replacement function. Quando l'applicazione tenta di chiamare la MessageBoxW funzione, chiamerà invece la funzione sostitutiva.When your application attempts to call the MessageBoxW function, it will call the replacement function instead.

Proteggi dalle chiamate ricorsive alle funzioni nelle correzioni di runtimeProtect against recursive calls to functions in runtime fixes

Il reentrancy_guard tipo può essere aggiunto alle funzioni per proteggerli dalle chiamate di funzione ricorsive.The reentrancy_guard type can be added to your functions to protect them against recursive function calls.

Ad esempio, è possibile creare una funzione di sostituzione per la CreateFile funzione.For example, you might produce a replacement function for the CreateFile function. È possibile che l'implementazione chiami la CopyFile funzione, ma l'implementazione della CopyFile funzione potrebbe chiamare la funzione CreateFile .Your implementation might call the CopyFile function, but the implementation of the CopyFile function might call the CreateFile function. Questo può causare un ciclo ricorsivo infinito di chiamate alla CreateFile funzione.This may lead to an infinite recursive cycle of calls to the CreateFile function.

Per ulteriori informazioni su, reentrancy_guard vedere Authoring.MDFor more information on reentrancy_guard see authoring.md

Dati di configurazioneConfiguration data

Se si desidera aggiungere i dati di configurazione alla correzione del runtime, è consigliabile aggiungerli a config.json .If you want to add configuration data to your runtime fix, consider adding it to the config.json. In questo modo, è possibile utilizzare FixupQueryCurrentDllConfig per analizzare facilmente i dati.That way, you can use the FixupQueryCurrentDllConfig to easily parse that data. Questo esempio analizza un valore booleano e una stringa da tale file di configurazione.This example parses a boolean and string value from that configuration file.

if (auto configRoot = ::FixupQueryCurrentDllConfig())
{
    auto& config = configRoot->as_object();

    if (auto enabledValue = config.try_get("enabled"))
    {
        g_enabled = enabledValue->as_boolean().get();
    }

    if (auto logPathValue = config.try_get("logPath"))
    {
        g_logPath = logPathValue->as_string().wstring();
    }
}

Metadati di correzioneFixup metadata

Ogni correzione e l'applicazione di avvio PSF hanno un file di metadati XML che contiene le informazioni seguenti:Each fixup and the PSF Launcher application has an XML metadata file that contains the following information:

  • Versione: la versione di PSF è in MAJOR. Secondaria. Formato della PATCH in base a SEM versione 2.Version: The version of the PSF is in MAJOR.MINOR.PATCH format according to Sem Version 2.
  • Piattaforma Windows minima: la versione minima di Windows richiesta per la correzione o l'utilità di avvio PSF.Minimum Windows Platform: The minimum windows version required for the fixup or PSF Launcher.
  • Descrizione: breve descrizione della correzione.Description: A short description of the fixup.
  • WhenToUse: euristica su quando è necessario applicare la correzione.WhenToUse: Heuristics on when you should apply the fixup.

Per un esempio, vedere il file di metadati FileRedirectionFixupMetadata. XML per la correzione del reindirizzamento.For an example, see the FileRedirectionFixupMetadata.xml metadata file for the redirection fixup. Lo schema dei metadati è disponibile qui.The metadata schema is available here.