Condividi tramite


Funzionamento del caricatore dei set di API

Importante

Le informazioni contenute in questo argomento si applicano a tutte le versioni di Windows 10 e versioni successive. Queste versioni verranno indicate qui come "Windows", richiamando eventuali eccezioni, se necessario.

I set di API si basano sul supporto del sistema operativo nel caricatore di libreria per introdurre in modo efficace un reindirizzamento dello spazio dei nomi del modulo nel processo di associazione della libreria. Il nome del contratto del set di API viene usato dal caricatore di librerie per eseguire un reindirizzamento di runtime del riferimento a un file binario host di destinazione che ospita l'implementazione appropriata del set di API.

Quando il caricatore rileva una dipendenza da un set di API in fase di esecuzione, il caricatore consulta i dati di configurazione nell'immagine per identificare il file binario host per un set di API. Questi dati di configurazione sono denominati schema del set di API. Lo schema viene assemblato come proprietà del sistema operativo e il mapping tra set di API e file binari può variare a seconda dei file binari inclusi in un determinato dispositivo. Lo schema consente di instradare correttamente una funzione importata in un singolo file binario in dispositivi diversi, anche se i nomi dei moduli dell'host binario sono stati rinominati o completamente sottoposti a refactoring in dispositivi Windows diversi.

Windows supporta due tecniche standard per l'utilizzo e l'interfaccia con i set di API: inoltro diretto e inoltro inverso.

Inoltro diretto

In questa configurazione, il codice di utilizzo importa direttamente un nome di modulo del set di API. Questa importazione viene risolta in una singola operazione ed è il metodo più efficiente con il minor sovraccarico. Concettualmente, questa risoluzione può puntare a file binari diversi in dispositivi Windows diversi, come illustrato nell'esempio seguente:

Set di API importato: api-feature1-l1-1-0.dll

  • PC Windows -> feature1.dll
  • HoloLens ->feature1_holo.dll
  • IoT ->feature1_iot.dll

Poiché i mapping vengono mantenuti in un repository di dati dello schema personalizzato, significa che un nome del set di API che termina con .dll non fa riferimento direttamente a un file su disco. La .dll parte del nome del set di API è solo una convenzione richiesta dal caricatore. Il nome del set di API è più simile a un alias o a un nome virtuale per un file DLL fisico. Questo rende il nome portabile nell'intera gamma di dispositivi Windows.

Inoltro inverso

Sebbene i nomi dei set di API forniscano uno spazio dei nomi stabile per i moduli tra i dispositivi, non è sempre pratico convertire ogni file binario in questo nuovo sistema. Ad esempio, un'applicazione potrebbe essere in uso comune per molti anni e la ricompilazione dei file binari dell'applicazione potrebbe non essere fattibile. Inoltre, alcune applicazioni potrebbero dover continuare a essere eseguite nei sistemi compilati prima dell'introduzione di set di API specifici.

Per supportare questo livello di compatibilità, viene fornito un sistema di server d'inoltro in tutti i dispositivi Windows che coprono un subset della superficie dell'API Win32. Questi server d'inoltro usano i nomi dei moduli introdotti nei PC Windows e sfruttano il sistema set di API per garantire la compatibilità tra tutti i dispositivi Windows.

L'operazione del caricatore si comporta come segue:

  1. In un dispositivo diverso da un PC Windows, il caricatore viene presentato una dipendenza del nome del modulo pc Windows legacy non presente nel dispositivo.
  2. Il caricatore individua un server d'inoltro del set di API per questo modulo e lo carica in memoria.
  3. Il server d'inoltro ha un mapping per il set di API per la funzione specificata chiamata.
  4. Il caricatore trova il file binario host appropriato per il dispositivo specificato.

Concettualmente, il mapping è simile al seguente:

DLL importata: feature1.dll

  • PC Windows -> feature1.dll
  • HoloLens ->feature1.dll server d'inoltro ->api-feature1-l1-1-0.dll ->feature1_holo.dll
  • Server d'inoltro IoT ->feature1.dll ->api-feature1-l1-1-0.dll ->feature1_iot.dll

Il risultato finale è funzionalmente uguale all'inoltro diretto, ma lo esegue in modo da ottimizzare la compatibilità delle applicazioni.

Nota

L'inoltro inverso fornisce copertura solo per un subset della superficie dell'API Win32. Non consente alle applicazioni destinate alle versioni desktop di Windows di essere eseguite in tutti i dispositivi Windows.