Udostępnij za pomocą


Domyślne sondowanie

Wystąpienie AssemblyLoadContext.Default jest odpowiedzialne za lokalizowanie zależności zestawu. W tym artykule opisano logikę sondowania instancji AssemblyLoadContext.Default.

Właściwości sondowania skonfigurowane przez hosta

Po uruchomieniu środowiska uruchomieniowego host środowiska uruchomieniowego udostępnia zestaw nazwanych właściwości sondowania, które konfigurują AssemblyLoadContext.Default ścieżki sondowania.

Każda właściwość sondowania jest opcjonalna. Jeśli istnieje, każda właściwość jest wartością ciągu zawierającą rozdzielaną listę ścieżek bezwzględnych. Ogranicznik to ";" w systemach Windows i ":" na wszystkich innych platformach.

Nazwa właściwości Description
TRUSTED_PLATFORM_ASSEMBLIES Lista ścieżek plików składowych platformy i aplikacji.
PLATFORM_RESOURCE_ROOTS Lista ścieżek katalogu do wyszukiwania zestawów zasobów satelitarnych.
NATIVE_DLL_SEARCH_DIRECTORIES Lista ścieżek katalogu do wyszukiwania niezarządzanych (natywnych) bibliotek.
APP_PATHS Lista ścieżek katalogów do przeszukiwania zarządzanych zestawów.

Jak są wypełniane właściwości?

Istnieją dwa główne scenariusze wypełniania właściwości w zależności od tego, czy <plik myapp>.deps.json istnieje.

  • Gdy plik *.deps.json jest obecny, jest analizowany w celu wypełnienia właściwości sondowania.
  • Jeśli plik *.deps.json nie jest obecny, przyjmuje się, że katalog aplikacji zawiera wszystkie zależności. Zawartość katalogu służy do wypełniania właściwości przeszukiwania.

Ponadto pliki *.deps.json dla wszystkich odwołanych struktur są podobnie analizowane.

Zmienna środowiskowa DOTNET_ADDITIONAL_DEPS może służyć do dodawania dodatkowych zależności. dotnet.exe Zawiera również opcjonalny --additional-deps parametr ustawiania tej wartości podczas uruchamiania aplikacji.

Uwaga / Notatka

Zmienna DOTNET_ADDITIONAL_DEPS środowiskowa i --additional-deps opcja wiersza polecenia dotyczą tylko aplikacji zależnych od platformy. Te opcje są ignorowane dla aplikacji samodzielnych. Aby uzyskać więcej informacji, zobacz Framework-dependent vs self-contained deployments (Wdrożenia zależne od struktury a wdrożenia samodzielne).

Właściwość APP_PATHS nie jest wypełniana domyślnie i jest pomijana dla większości aplikacji.

Dostęp do listy wszystkich plików *.deps.json używanych przez aplikację można uzyskać za pośrednictwem adresu System.AppContext.GetData("APP_CONTEXT_DEPS_FILES").

Jak wyświetlić właściwości sondowania z kodu zarządzanego?

Każda właściwość jest dostępna przez wywołanie AppContext.GetData(String) funkcji z nazwą właściwości z powyższej tabeli.

Jak debugować konstrukcję właściwości sondowania?

Host środowiska uruchomieniowego platformy .NET Core wyświetli przydatne komunikaty śledzenia po włączeniu określonych zmiennych środowiskowych:

Zmienna środowiskowa Description
DOTNET_HOST_TRACE=1 Włącza śledzenie.
DOTNET_HOST_TRACEFILE=<path> Przekierowuje do ścieżki pliku zamiast domyślnej ścieżki stderr.
DOTNET_HOST_TRACE_VERBOSITY Ustawia szczegółowość z zakresu od 1 (najniższa) do 4 (najwyższa).

Aby uzyskać więcej informacji, zobacz zmienne środowiskowe DOTNET_HOST_TRACE.

Domyślne sondowanie modułu zarządzanego

Podczas sondowania w celu zlokalizowania zestawu zarządzanego, AssemblyLoadContext.Default przeszukuje w następującej kolejności:

  • Pliki pasujące do AssemblyName.Name w TRUSTED_PLATFORM_ASSEMBLIES (po usunięciu rozszerzeń plików).
  • Pliki zestawów w programie APP_PATHS z typowymi rozszerzeniami plików.

Sondowanie zestawu satelitarnego (zasobu)

Aby znaleźć zestaw satelitarny dla określonej kultury, skonstruuj zestaw ścieżek plików.

Dla każdej ścieżki w PLATFORM_RESOURCE_ROOTS i następnie APP_PATHS, dołącz CultureInfo.Name ciąg, separator katalogu, AssemblyName.Name ciąg i rozszerzenie ".dll".

Jeśli istnieje dowolny pasujący plik, spróbuj załadować i zwrócić go.

Sondowanie niezarządzanej biblioteki (natywnej)

Niezarządzany algorytm wyszukiwania biblioteki środowiska uruchomieniowego jest identyczny na wszystkich platformach. Jednak ponieważ rzeczywiste obciążenie niezarządzanej biblioteki jest wykonywane przez podstawową platformę, zaobserwowane zachowanie może być nieco inne.

  1. Sprawdź, czy podana nazwa biblioteki reprezentuje ścieżkę bezwzględną lub względną.

  2. Jeśli nazwa reprezentuje ścieżkę bezwzględną, użyj nazwy bezpośrednio dla wszystkich kolejnych operacji. W przeciwnym razie użyj nazwy i utwórz kombinacje zdefiniowane przez platformę, aby wziąć pod uwagę. Kombinacje składają się z prefiksów specyficznych dla platformy (na przykład lib) i/lub sufiksów (na przykład .dll, , .dylibi .so). Nie jest to wyczerpująca lista i nie reprezentuje dokładnych wysiłków dokonanych na każdej platformie. Jest to tylko przykład tego, co jest brane pod uwagę. Aby uzyskać więcej informacji, zobacz ładowanie biblioteki natywnej.

  3. Nazwa oraz, jeśli ścieżka jest względna, każda kombinacja, są następnie używane w dalszych krokach. Pierwsza pomyślna próba załadowania natychmiast zwraca uchwyt do załadowanej biblioteki.

    • Dołącz ją do każdej ścieżki podanej NATIVE_DLL_SEARCH_DIRECTORIES we właściwości i spróbuj załadować.

    • Jeśli DefaultDllImportSearchPathsAttribute nie jest zdefiniowany w zestawie wywołującym lub p/invoke albo jest zdefiniowany i zawiera DllImportSearchPath.AssemblyDirectory, dołącz nazwę lub kombinację do katalogu zestawu wywołującego i spróbuj załadować.

    • Użyj go bezpośrednio, aby załadować bibliotekę.

  4. Wskaż, że biblioteka nie została załadowana.