Condividi tramite


Probe predefinito

L'istanza AssemblyLoadContext.Default è responsabile per individuare le dipendenze di un componente di assembly. Questo articolo descrive la logica di analisi dell'istanza AssemblyLoadContext.Default.

Host configurato per le proprietà di sondaggio

Quando il runtime viene avviato, l'host di runtime fornisce un set di proprietà di probe nominate che configurano i percorsi del probe AssemblyLoadContext.Default.

Ogni proprietà della sonda è facoltativa. Se presente, ogni proprietà è un valore stringa che contiene un elenco delimitato di percorsi assoluti. Il delimitatore è ';' in Windows e ':' in tutte le altre piattaforme.

Nome della proprietà Descrizione
TRUSTED_PLATFORM_ASSEMBLIES Elenco dei percorsi dei file di assembly della piattaforma e dell'applicazione.
PLATFORM_RESOURCE_ROOTS Elenco dei percorsi di directory in cui cercare gli assembly di risorse satellite.
NATIVE_DLL_SEARCH_DIRECTORIES Elenco dei percorsi di directory in cui cercare librerie non gestite (native).
APP_PATHS Elenco dei percorsi di directory in cui cercare gli assembly gestiti.

Come vengono popolate le proprietà?

Esistono due scenari principali per popolare le proprietà a seconda che il <file myapp>.deps.json esista.

  • Quando il file *.deps.json è presente, viene analizzato per riempire le proprietà di sondaggio.
  • Quando il file *.deps.json non è presente, si presuppone che la directory dell'applicazione contenga tutte le dipendenze. Il contenuto della directory viene utilizzato per riempire le proprietà di rilevamento.

Inoltre, i file *.deps.json per qualsiasi framework a cui si fa riferimento vengono analizzati in modo analogo.

La variabile DOTNET_ADDITIONAL_DEPS di ambiente può essere usata per aggiungere altre dipendenze. dotnet.exe contiene anche un parametro facoltativo --additional-deps per impostare questo valore all'avvio dell'applicazione.

La APP_PATHS proprietà non viene popolata per impostazione predefinita e viene omessa per la maggior parte delle applicazioni.

È possibile accedere all'elenco di tutti i file *.deps.json usati dall'applicazione tramite System.AppContext.GetData("APP_CONTEXT_DEPS_FILES").

Come è possibile visualizzare le proprietà di probe dal codice gestito?

Ogni proprietà è disponibile chiamando la AppContext.GetData(String) funzione con il nome della proprietà della tabella precedente.

Come posso eseguire il debug della costruzione delle proprietà della sonda?

L'host di runtime .NET Core restituirà messaggi di traccia utili quando alcune variabili di ambiente sono abilitate:

Variabile di ambiente Descrizione
COREHOST_TRACE=1 Abilita il tracciamento.
COREHOST_TRACEFILE=<path> Traccia a un percorso del file invece del predefinito stderr.
COREHOST_TRACE_VERBOSITY Imposta il livello di dettaglio da 1 (più basso) a 4 (massimo).

Indagine predefinita dell'assembly gestito

Quando si cerca di localizzare un assembly gestito, l'oggetto controlla nell'ordine seguente: AssemblyLoadContext.Default

  • File corrispondenti a AssemblyName.Name in TRUSTED_PLATFORM_ASSEMBLIES (dopo la rimozione delle estensioni di file).
  • File di assemblaggio in APP_PATHS con estensioni di file comuni.

Sondaggio di assemblaggio del satellite (risorsa)

Per trovare un assembly satellite per una cultura specifica, creare un insieme di percorsi di file.

Per ogni percorso in PLATFORM_RESOURCE_ROOTS e quindi APP_PATHSaggiungere la CultureInfo.Name stringa, un separatore di directory, la AssemblyName.Name stringa e l'estensione '.dll'.

Se esiste un file corrispondente, tentare di caricarlo e restituirlo.

Probe della libreria non gestita (nativa)

L'algoritmo di probe della libreria non gestita del runtime è identico in tutte le piattaforme. Tuttavia, poiché il carico effettivo della libreria non gestita viene eseguito dalla piattaforma sottostante, il comportamento osservato può essere leggermente diverso.

  1. Controllare se il nome della libreria fornito rappresenta un percorso assoluto o relativo.

  2. Se il nome rappresenta un percorso assoluto, usare direttamente il nome per tutte le operazioni successive. In caso contrario, utilizzare il nome e creare le combinazioni definite dalla piattaforma da prendere in considerazione. Le combinazioni sono costituite da prefissi specifici della piattaforma (ad esempio, lib) e/o suffissi (ad esempio, .dll, .dylibe .so). Questo non è un elenco completo e non rappresenta l'esatto sforzo fatto su ogni piattaforma. È solo un esempio di ciò che viene considerato. Per altre informazioni, vedere Caricamento della libreria nativa.

  3. Il nome e ogni combinazione, se il percorso è relativo, vengono quindi utilizzati nei passaggi seguenti. Il primo tentativo di caricamento riuscito restituisce immediatamente l'handle alla libreria caricata.

    • Aggiungerlo a ogni percorso fornito nella proprietà NATIVE_DLL_SEARCH_DIRECTORIES e tentare di caricare.

    • Se DefaultDllImportSearchPathsAttribute non è definito nell'assembly chiamante, né come P/Invoke, oppure se è definito e include DllImportSearchPath.AssemblyDirectory, aggiungi il nome o la combinazione alla directory dell'assembly chiamante e tenta di caricarlo.

    • Usarlo direttamente per caricare la libreria.

  4. Indica che il caricamento della libreria non è riuscito.