Standardüberprüfung

Die AssemblyLoadContext.Default-Instanz ist für das Suchen der Abhängigkeiten einer Assembly verantwortlich. In diesem Artikel wird die Überprüfungslogik der AssemblyLoadContext.Default-Instanz beschrieben.

Vom Host konfigurierte Überprüfungseigenschaften

Wenn die Runtime gestartet wird, stellt der Laufzeithost eine Reihe von benannten Überprüfungseigenschaften bereit, mit denen die Testpfade im AssemblyLoadContext.Default konfiguriert werden.

Jede der Überprüfungseigenschaften ist optional. Ist eine Eigenschaft vorhanden, ist sie ein Zeichenfolgenwert, der eine durch Trennzeichen getrennte Liste absoluter Pfade enthält. Das Trennzeichen ist unter Windows „;“ und auf allen anderen Plattformen „:“.

Eigenschaftenname Beschreibung
TRUSTED_PLATFORM_ASSEMBLIES Liste der Plattform- und Anwendungsassembly-Dateipfade
PLATFORM_RESOURCE_ROOTS Liste der Verzeichnispfade für die Suche nach Satellitenressourcenassemblys
NATIVE_DLL_SEARCH_DIRECTORIES Liste der Verzeichnispfade für die Suche nach nicht verwalteten (nativen) Bibliotheken
APP_PATHS Liste der Verzeichnispfade für die Suche nach verwalteten Assemblys

Wie werden diese Eigenschaften aufgefüllt?

Es gibt zwei Hauptszenarien für das Auffüllen der Eigenschaften, die davon abhängen, ob eine Datei <meineApp>.deps.json vorhanden ist.

  • Wenn die Datei *.deps.json vorhanden ist, wird sie analysiert, um die Testeigenschaften aufzufüllen.
  • Wenn die Datei *.deps.json nicht vorhanden ist, wird davon ausgegangen, dass alle Abhängigkeiten im Anwendungsverzeichnis enthalten sind. Der Inhalt des Verzeichnisses wird dann verwendet, um die Überprüfungseigenschaften aufzufüllen.

Außerdem werden die *.deps.json-Dateien jeglicher referenzierter Frameworks auf ähnliche Weise analysiert.

Die Umgebungsvariable DOTNET_ADDITIONAL_DEPS kann verwendet werden, um zusätzliche Abhängigkeiten hinzuzufügen. dotnet.exe enthält außerdem einen optionalen --additional-deps-Parameter, um diesen Wert beim Anwendungsstart festzulegen.

Die Eigenschaft APP_PATHS wird nicht standardmäßig mit Daten aufgefüllt und für die meisten Anwendungen ausgelassen.

Die Liste aller *.deps.json-Dateien, die von der Anwendung verwendet werden, kann über System.AppContext.GetData("APP_CONTEXT_DEPS_FILES") aufgerufen werden.

Wie kann ich die Überprüfungseigenschaften von verwaltetem Code anzeigen?

Jede Eigenschaft ist über einen Aufruf der AppContext.GetData(String)-Funktion mit dem Eigenschaftennamen aus der obigen Tabelle verfügbar.

Wie debugge ich die Erstellung der Überprüfungseigenschaften?

Der .NET Core-Laufzeithost gibt nützliche Ablaufverfolgungsmeldungen aus, wenn bestimmte Umgebungsvariablen aktiviert sind:

Umgebungsvariable Beschreibung
COREHOST_TRACE=1 Aktiviert die Ablaufverfolgung
COREHOST_TRACEFILE=<path> Gibt die Ablaufverfolgung in einem Dateipfad anstelle der Standardausgabe an stderr aus
COREHOST_TRACE_VERBOSITY Legt die Ausführlichkeit zwischen 1 (niedrigste) und 4 (höchste) fest

Standardüberprüfung verwalteter Assemblys

Beim Überprüfen einer verwalteten Assembly sucht der AssemblyLoadContext.Default in der folgenden Reihenfolge:

  • Dateien, die mit dem AssemblyName.Name in TRUSTED_PLATFORM_ASSEMBLIES übereinstimmen (nach dem Entfernen von Dateierweiterungen)
  • Assemblydateien in APP_PATHS mit allgemeinen Dateierweiterungen

Überprüfungen von Satellitenassemblys (Ressourcen)

Um eine Satellitenassembly für eine bestimmte Kultur zu suchen, erstellen Sie einen Satz von Dateipfaden.

Fügen Sie für jeden Pfad in PLATFORM_RESOURCE_ROOTS und dann APP_PATHS die Zeichenfolge CultureInfo.Name, ein Verzeichnistrennzeichen, die Zeichenfolge AssemblyName.Name und die Erweiterung „.dll“ an.

Wenn eine übereinstimmende Datei vorhanden ist, versuchen Sie, diese zu laden und zurückzugeben.

Überprüfung nicht verwalteter (nativer) Bibliotheken

Der Testalgorithmus der Runtime für nicht verwaltete Bibliotheken ist auf allen Plattformen identisch. Da das tatsächliche Laden der nicht verwalteten Bibliothek jedoch von der zugrunde liegenden Plattform durchgeführt wird, kann das beobachtete Verhalten geringfügig abweichen.

  1. Überprüfen Sie, ob der angegebene Bibliotheksname einen absoluten oder relativen Pfad darstellt.

  2. Wenn der Name einen absoluten Pfad darstellt, verwenden Sie den Namen direkt für alle nachfolgenden Vorgänge. Verwenden Sie andernfalls den Namen, und erstellen Sie zu berücksichtigende plattformdefinierte Kombinationen. Kombinationen bestehen aus plattformspezifischen Präfixen (z. B lib) und/oder Suffixen (z. B .dll, .dylib und .so). Dies ist keine vollständige Liste und stellt nicht den genauen Aufwand dar, der auf jeder Plattform unternommen wird. Es ist nur ein Beispiel für das, was berücksichtigt wird. Weitere Informationen finden Sie unter Laden der nativen Bibliothek.

  3. Der Name und, wenn der Pfad relativ ist, jede Kombination, wird dann in den folgenden Schritten verwendet. Beim ersten erfolgreichen Ladeversuch wird das Handle sofort an die geladene Bibliothek zurückgegeben.

    • Fügen Sie ihn an jeden Pfad an, der in der NATIVE_DLL_SEARCH_DIRECTORIES-Eigenschaft angegeben wird, und versuchen Sie, zu laden.

    • Wenn DefaultDllImportSearchPathsAttribute entweder nicht für die aufrufende Assembly oder p/invoke definiert ist, oder definiert ist und DllImportSearchPath.AssemblyDirectory enthält, fügen Sie den Namen oder die Kombination an das Verzeichnis der aufrufenden Assembly an, und versuchen Sie, zu laden.

    • Verwenden Sie es direkt, um die Bibliothek zu laden.

  4. Geben Sie an, dass die Bibliothek nicht geladen werden konnte.