Использование начальных сборок размещения в ASP.NET Core

Примечание.

Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 8 этой статьи.

Предупреждение

Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в статье о политике поддержки .NET и .NET Core. В текущем выпуске см . версию .NET 8 этой статьи.

Внимание

Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

В текущем выпуске см . версию .NET 8 этой статьи.

Автор: Павел Крымец (Pavel Krymets)

Реализация IHostingStartup (размещение при запуске) позволяет добавлять в приложение улучшения из внешней сборки при запуске. Например, внешняя библиотека может использовать реализацию размещения при запуске, чтобы доставить дополнительные поставщики конфигурации или службы для приложения.

Просмотреть или скачать образец кода (описание загрузки)

Атрибут HostingStartup

Атрибут HostingStartup указывает на наличие начальной сборки размещения, которая будет активирована во время выполнения.

Входная сборка или сборка, содержащая класс Startup, автоматически сканируется на наличие атрибута HostingStartup. Список сборок, в котором будет выполняться поиск атрибута HostingStartup, загружается во время выполнения из конфигурации в WebHostDefaults.HostingStartupAssembliesKey. Список сборок, которые необходимо исключить из обнаружения, загружается из WebHostDefaults.HostingStartupExcludeAssembliesKey.

В следующем примере пространство имен для начальной сборки размещения — StartupEnhancement. Класс, содержащий код запуска размещения, — StartupEnhancementHostingStartup:

[assembly: HostingStartup(typeof(StartupEnhancement.StartupEnhancementHostingStartup))]

Атрибут HostingStartup обычно находится в файле класса реализации начальной сборки размещения IHostingStartup.

Обнаружение загруженных начальных сборок размещения

Для обнаружения загруженных сборок размещения при запуске включите ведение журнала и проверьте журналы приложения. В журнал вносятся ошибки, возникающие при загрузке сборок. Загруженные начальные сборки размещения регистрируются на уровне отладки, также регистрируются все ошибки.

Отключение автоматической загрузки начальных сборок размещения

Чтобы отключить автоматическую загрузку начальных сборок размещения, используйте один из следующих подходов:

  • Чтобы предотвратить загрузку всех начальных сборок размещения, установите значение true или 1 для одного из следующих параметров:

    • Параметр конфигурации узла "Запретить размещение при запуске".

      public static IHostBuilder CreateHostBuilder(string[] args) =>
          Host.CreateDefaultBuilder(args)
              .ConfigureWebHostDefaults(webBuilder =>
              {
                  webBuilder.UseSetting(
                          WebHostDefaults.PreventHostingStartupKey, "true")
                      .UseStartup<Startup>();
              });
      
    • Переменная среды ASPNETCORE_PREVENTHOSTINGSTARTUP.

  • Чтобы предотвратить загрузку конкретных сборок размещения, установите строку, содержащую разделенный точками с запятой список сборок размещения, которые необходимо исключить при запуске, в качестве значения одного из следующих параметров:

    • Параметр конфигурации узла "Исключаемые сборки размещения при запуске".

      public static IHostBuilder CreateHostBuilder(string[] args) =>
          Host.CreateDefaultBuilder(args)
              .ConfigureWebHostDefaults(webBuilder =>
              {
                  webBuilder.UseSetting(
                          WebHostDefaults.HostingStartupExcludeAssembliesKey, 
                          "{ASSEMBLY1;ASSEMBLY2; ...}")
                      .UseStartup<Startup>();
              });
      

      Заполнитель {ASSEMBLY1;ASSEMBLY2; ...} представляет список сборок, разделенный точками с запятой.

    • Переменная среды ASPNETCORE_HOSTINGSTARTUPEXCLUDEASSEMBLIES.

Если заданы параметры конфигурации узла и переменная среды, на поведение влияют параметры узла.

При отключении сборок размещения при запуске с использованием параметра узла или переменной среды сборка отключается на глобальном уровне, и также могут быть отключены некоторые характеристики приложения.

Project

Создайте размещение при запуске для любого из указанных ниже типов проектов:

Библиотека классов

Расширение размещения при запуске можно указать в библиотеке классов. Библиотека содержит атрибут HostingStartup.

Пример кода включает приложение Razor Pages HostingStartupApp и библиотеку классов HostingStartupLibrary. Библиотека классов:

  • Содержит класс размещения при запуске ServiceKeyInjection, который реализует IHostingStartup. ServiceKeyInjection добавляет пару строк службы в конфигурацию приложения с помощью поставщика конфигурации, размещаемой в памяти (AddInMemoryCollection).
  • Включает атрибут HostingStartup, определяющий пространство имен и класс размещения при запуске.

Метод ServiceKeyInjection класса Configure использует IWebHostBuilder для добавления улучшений в приложение.

HostingStartupLibrary/ServiceKeyInjection.cs:

[assembly: HostingStartup(typeof(HostingStartupLibrary.ServiceKeyInjection))]

namespace HostingStartupLibrary
{
    public class ServiceKeyInjection : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            builder.ConfigureAppConfiguration(config =>
            {
                var dict = new Dictionary<string, string>
                {
                    {"DevAccount_FromLibrary", "DEV_1111111-1111"},
                    {"ProdAccount_FromLibrary", "PROD_2222222-2222"}
                };

                config.AddInMemoryCollection(dict);
            });
        }
    }
}

Страница индекса приложения считывает и отображает значения конфигурации для двух ключей, устанавливаемых начальной сборкой размещения библиотеки класса:

HostingStartupApp/Pages/Index.cshtml.cs:

public class IndexModel : PageModel
{
    public IndexModel(IConfiguration config)
    {
        ServiceKey_Development_Library = config["DevAccount_FromLibrary"];
        ServiceKey_Production_Library = config["ProdAccount_FromLibrary"];
        ServiceKey_Development_Package = config["DevAccount_FromPackage"];
        ServiceKey_Production_Package = config["ProdAccount_FromPackage"];
    }

    public string ServiceKey_Development_Library { get; private set; }
    public string ServiceKey_Production_Library { get; private set; }
    public string ServiceKey_Development_Package { get; private set; }
    public string ServiceKey_Production_Package { get; private set; }

    public void OnGet()
    {
    }
}

Пример кода также включает проект пакета NuGet, предоставляющий отдельное размещение при запуске HostingStartupPackage. Характеристики пакета аналогичны характеристикам библиотеки классов, приведенным ранее. Пакет обладает следующими характеристиками:

  • Содержит класс размещения при запуске ServiceKeyInjection, который реализует IHostingStartup. ServiceKeyInjection добавляет пару строк службы в конфигурацию приложения.
  • Включает атрибут HostingStartup.

HostingStartupPackage/ServiceKeyInjection.cs:

[assembly: HostingStartup(typeof(HostingStartupPackage.ServiceKeyInjection))]

namespace HostingStartupPackage
{
    public class ServiceKeyInjection : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            builder.ConfigureAppConfiguration(config =>
            {
                var dict = new Dictionary<string, string>
                {
                    {"DevAccount_FromPackage", "DEV_3333333-3333"},
                    {"ProdAccount_FromPackage", "PROD_4444444-4444"}
                };

                config.AddInMemoryCollection(dict);
            });
        }
    }
}

Страница индекса приложения считывает и отображает значения конфигурации для двух ключей, устанавливаемых начальной сборкой размещения пакета:

HostingStartupApp/Pages/Index.cshtml.cs:

public class IndexModel : PageModel
{
    public IndexModel(IConfiguration config)
    {
        ServiceKey_Development_Library = config["DevAccount_FromLibrary"];
        ServiceKey_Production_Library = config["ProdAccount_FromLibrary"];
        ServiceKey_Development_Package = config["DevAccount_FromPackage"];
        ServiceKey_Production_Package = config["ProdAccount_FromPackage"];
    }

    public string ServiceKey_Development_Library { get; private set; }
    public string ServiceKey_Production_Library { get; private set; }
    public string ServiceKey_Development_Package { get; private set; }
    public string ServiceKey_Production_Package { get; private set; }

    public void OnGet()
    {
    }
}

Консольное приложение без точки входа

Этот подход может использоваться только для приложений .NET Core, но не для приложений .NET Framework.

Расширение динамического размещения при запуске, для активации которого не требуется ссылка во время компиляции, может быть реализовано в консольном приложении без точки входа, содержащем атрибут HostingStartup. При публикации консольного приложения создается начальная сборка размещения, которая может использоваться в хранилище среды выполнения.

В этом процессе используется консольное приложение без точки входа, так как:

  • Файл зависимостей необходим для функционирования размещения при запуске в начальной сборке размещения. Файл зависимостей является ресурсом исполняемого приложения, который создается путем публикации приложения, а не библиотеки.
  • Библиотеку невозможно добавить непосредственно в хранилище пакетов среды выполнения, для которого требуется запускаемый проект для общей среды выполнения.

В ходе создания динамического размещения при запуске:

  • Сборка запуска размещения создается из консольного приложения без точки входа:
    • содержит класс с реализацией IHostingStartup;
    • содержит атрибут HostingStartup для определения класса реализации IHostingStartup.
  • Консольное приложение публикуется для получения зависимостей начальной загрузки. После публикации консольного приложения неиспользуемые зависимости исключаются из файла зависимостей.
  • Файл зависимостей изменяется, чтобы задать расположение среды выполнения начальной сборки размещения.
  • Начальная сборка размещения и соответствующий файл зависимостей размещаются в хранилище пакетов среды выполнения. Чтобы можно было обнаружить начальную сборку размещения и ее файл зависимостей, они указываются в паре переменных среды.

Консольное приложение ссылается на пакет Microsoft.AspNetCore.Hosting.Abstractions:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" 
                      Version="3.0.0" />
  </ItemGroup>

</Project>

Атрибут HostingStartup определяет класс как реализацию IHostingStartup для загрузки и выполнения при построении IWebHost. В следующем примере используется пространство имен StartupEnhancement и класс StartupEnhancementHostingStartup:

[assembly: HostingStartup(typeof(StartupEnhancement.StartupEnhancementHostingStartup))]

Класс реализует IHostingStartup. Метод класса Configure использует IWebHostBuilder для добавления улучшений в приложение. IHostingStartup.Configure в начальной сборке размещения вызывается средой выполнения до Startup.Configure в пользовательском коде, что позволяет пользовательскому коду перезаписать конфигурацию, предоставленную начальной сборкой размещения.

namespace StartupEnhancement
{
    public class StartupEnhancementHostingStartup : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            // Use the IWebHostBuilder to add app enhancements.
        }
    }
}

При создании IHostingStartup проекта файл зависимостей (.deps.json) задает runtime расположение сборки в папку bin :

"targets": {
  ".NETCoreApp,Version=v3.0": {
    "StartupEnhancement/1.0.0": {
      "dependencies": {
        "Microsoft.AspNetCore.Hosting.Abstractions": "3.0.0"
      },
      "runtime": {
        "StartupEnhancement.dll": {}
      }
    }
  }
}

Показана только часть файла. Имя сборки в примере — StartupEnhancement.

Конфигурация, предоставляемая размещением при запуске

Существует два подхода к подготовке конфигурации в зависимости от того, какой конфигурацией вы хотите отдать приоритет — конфигурации размещения при запуске или конфигурации приложения:

  1. Задайте конфигурацию приложению, используя ConfigureAppConfiguration для загрузки конфигурации после выполнения делегатов приложения ConfigureAppConfiguration. При таком подходе конфигурация размещения при запуске будет иметь приоритет над конфигурацией приложения.
  2. Задайте конфигурацию приложению, используя UseConfiguration для загрузки конфигурации до выполнения делегатов приложения ConfigureAppConfiguration. При таком подходе конфигурация приложения будет иметь приоритет над конфигурацией размещения при запуске.
public class ConfigurationInjection : IHostingStartup
{
    public void Configure(IWebHostBuilder builder)
    {
        Dictionary<string, string> dict;

        builder.ConfigureAppConfiguration(config =>
        {
            dict = new Dictionary<string, string>
            {
                {"ConfigurationKey1", 
                    "From IHostingStartup: Higher priority " +
                    "than the app's configuration."},
            };

            config.AddInMemoryCollection(dict);
        });

        dict = new Dictionary<string, string>
        {
            {"ConfigurationKey2", 
                "From IHostingStartup: Lower priority " +
                "than the app's configuration."},
        };

        var builtConfig = new ConfigurationBuilder()
            .AddInMemoryCollection(dict)
            .Build();

        builder.UseConfiguration(builtConfig);
    }
}

Указание начальных сборок размещения

Для библиотеки класса или размещения при запуске с помощью консольного приложения укажите имя начальной сборки размещения в переменной среды ASPNETCORE_HOSTINGSTARTUPASSEMBLIES. Переменная среды — это список сборок, разделенный точками с запятой.

Только начальные сборки размещения проверяются на наличие атрибута HostingStartup. Для примера приложения HostingStartupApp необходимо установить следующее значение для переменной среды, чтобы обнаружить сборки размещения при запуске, описанные ранее:

HostingStartupLibrary;HostingStartupPackage;StartupDiagnostics

Начальную сборку размещения также можно задать с помощью параметра конфигурации узла "Начальные сборки размещения".

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseSetting(
                    WebHostDefaults.HostingStartupAssembliesKey, 
                    "{ASSEMBLY1;ASSEMBLY2; ...}")
                .UseStartup<Startup>();
        });

Заполнитель {ASSEMBLY1;ASSEMBLY2; ...} представляет список сборок, разделенный точками с запятой.

При наличии нескольких начальных сборок размещения их методы Configure выполняются в порядке расположения сборок.

Активация

Ниже приведены варианты активации размещения при запуске:

  • Хранилище среды выполнения. Активация не требует ссылки на время компиляции для активации. Пример приложения помещает начальную сборку размещения и файлы зависимостей в папку deployment, чтобы облегчить развертывание размещения при запуске в среде с несколькими компьютерами. Папка deployment также включает сценарий PowerShell, который создает или изменяет переменные среды в системе развертывания, чтобы включить размещение при запуске.
  • Ссылка на время компиляции, необходимая для активации

Хранилище среды выполнения

Реализация размещения при запуске помещается в хранилище среды выполнения. Ссылка на сборку во время компиляции не требуется расширенному приложению.

После начальной сборки размещения создается хранилище среды выполнения с помощью файла манифеста проекта и команды dotnet store.

dotnet store --manifest {MANIFEST FILE} --runtime {RUNTIME IDENTIFIER} --output {OUTPUT LOCATION} --skip-optimization

В примере приложения (проект RuntimeStore) используется такая команда:

dotnet store --manifest store.manifest.csproj --runtime win7-x64 --output ./deployment/store --skip-optimization

Чтобы среда выполнения могла обнаружить хранилище среды выполнения, расположение хранилища среды выполнения добавляется к переменной среды DOTNET_SHARED_STORE.

Изменение и размещение файла зависимостей размещения при запуске

Чтобы активировать расширение без ссылки на пакет расширения, укажите дополнительные зависимости в среде выполнения с помощью additionalDeps. additionalDeps предоставляет следующие возможности:

  • Расширьте граф библиотеки приложения, предоставив набор дополнительных .deps.json файлов для слияния с собственным .deps.json файлом приложения при запуске.
  • Обнаруживать и скачивать начальную сборку размещения.

Рекомендуемые действия при создании файла дополнительных зависимостей.

  1. Выполните команду dotnet publish для файла манифеста хранилища среды выполнения, ссылка на который создавалась в предыдущем разделе.
  2. Удалите ссылку на манифест из библиотек и runtime раздел результирующего .deps.json файла.

В примере проекта свойство store.manifest/1.0.0 удаляется из разделов targets и libraries.

{
  "runtimeTarget": {
    "name": ".NETCoreApp,Version=v3.0",
    "signature": ""
  },
  "compilationOptions": {},
  "targets": {
    ".NETCoreApp,Version=v3.0": {
      "store.manifest/1.0.0": {
        "dependencies": {
          "StartupDiagnostics": "1.0.0"
        },
        "runtime": {
          "store.manifest.dll": {}
        }
      },
      "StartupDiagnostics/1.0.0": {
        "runtime": {
          "lib/netcoreapp3.0/StartupDiagnostics.dll": {
            "assemblyVersion": "1.0.0.0",
            "fileVersion": "1.0.0.0"
          }
        }
      }
    }
  },
  "libraries": {
    "store.manifest/1.0.0": {
      "type": "project",
      "serviceable": false,
      "sha512": ""
    },
    "StartupDiagnostics/1.0.0": {
      "type": "package",
      "serviceable": true,
      "sha512": "sha512-xrhzuNSyM5/f4ZswhooJ9dmIYLP64wMnqUJSyTKVDKDVj5T+qtzypl8JmM/aFJLLpYrf0FYpVWvGujd7/FfMEw==",
      "path": "startupdiagnostics/1.0.0",
      "hashPath": "startupdiagnostics.1.0.0.nupkg.sha512"
    }
  }
}

Поместите .deps.json файл в следующее расположение:

{ADDITIONAL DEPENDENCIES PATH}/shared/{SHARED FRAMEWORK NAME}/{SHARED FRAMEWORK VERSION}/{ENHANCEMENT ASSEMBLY NAME}.deps.json
  • {ADDITIONAL DEPENDENCIES PATH}: расположение, добавленное DOTNET_ADDITIONAL_DEPS в переменную среды.
  • {SHARED FRAMEWORK NAME}: общая платформа, необходимая для этого дополнительного файла зависимостей.
  • {SHARED FRAMEWORK VERSION}: минимальная версия общей платформы.
  • {ENHANCEMENT ASSEMBLY NAME}: имя сборки улучшения.

В примере приложения (проект RuntimeStore) файл дополнительных зависимостей помещается в следующее расположение:

deployment/additionalDeps/shared/Microsoft.AspNetCore.App/3.0.0/StartupDiagnostics.deps.json

Чтобы среда выполнения могла обнаружить хранилище среды выполнения, расположение файла дополнительных зависимостей добавляется к переменной среды DOTNET_ADDITIONAL_DEPS.

В примере приложения (проект RuntimeStore) для сборки хранилища среды выполнения и создания файла дополнительных зависимостей используется скрипт PowerShell.

Примеры установки переменных среды для различных операционных систем см. в разделе Использование нескольких сред.

Развертывание

Чтобы упростить развертывание размещения при запуске в среде с несколькими компьютерами, пример приложения создает в опубликованном результате папку deployment. Эта папка содержит:

  • Хранилище среды выполнения размещения при запуске.
  • Файл зависимостей размещения при запуске.
  • Скрипт PowerShell, который создает или изменяет ASPNETCORE_HOSTINGSTARTUPASSEMBLIES, DOTNET_SHARED_STORE и DOTNET_ADDITIONAL_DEPS для поддержки активации размещения при запуске. Запустите сценарий из командной строки PowerShell с правами администратора в системе развертывания.

Пакет NuGet

Расширение размещения при запуске можно указать в пакете NuGet. Пакет содержит атрибут HostingStartup. Типы размещения при запуске, предоставляемые пакетом, становятся доступными для приложения с использованием одного из следующих методов:

  • Файл проекта расширенного приложения создает ссылку на пакет для размещения при запуске в файле проекта приложения (ссылка во время компиляции). При наличии ссылки на время компиляции сборка запуска размещения и все его зависимости включаются в файл зависимостей приложения (.deps.json). Этот подход применяется к пакету начальной сборки размещения, опубликованному на nuget.org.
  • Файл зависимостей размещения при запуске становится доступным для расширенного приложения, как описано в разделе Хранилище среды выполнения (без ссылок во время компиляции).

Дополнительные сведения о пакетах NuGet и хранилище среды выполнения см. в разделах:

Папка bin проекта

Расширение размещения при запуске может быть представлено сборкой, разворачиваемой в папке bin расширенного приложения. Типы размещения при запуске, предоставляемые сборкой, становятся доступными для приложения с использованием одного из следующих методов:

  • Файл проекта расширенного приложения создает ссылку сборки на размещение при запуске (ссылка во время компиляции). При наличии ссылки на время компиляции сборка запуска размещения и все его зависимости включаются в файл зависимостей приложения (.deps.json). Этот подход применяется при вызове сценария развертывания ссылки на сборку запуска размещения (.dll файл) и перемещение сборки в любой из следующих вариантов:
    • Проект, который будет использовать ее.
    • Расположение, доступное использующему проекту.
  • Файл зависимостей размещения при запуске становится доступным для расширенного приложения, как описано в разделе Хранилище среды выполнения (без ссылок во время компиляции).
  • При выборе платформа .NET Framework сборка загружается в контексте загрузки по умолчанию, что на платформа .NET Framework означает, что сборка находится в любом из следующих расположений:
    • Базовый путь приложения: папка bin , в которой находится исполняемый файл приложения (.exe).
    • Глобальный кэш сборок (GAC): GAC хранит сборки, к которым совместно используются несколько приложений платформа .NET Framework. Дополнительные сведения см. в статье "Практическое руководство. Установка сборки в глобальный кэш сборок" в документации по платформа .NET Framework.

Пример кода

В примере кода (инструкции по скачиванию примера) показаны сценарии реализации размещения при запуске:

  • Две сборки запуска (библиотеки классов) задают пару пар конфигурации key-value в памяти:
    • Пакет NuGet (HostingStartupPackage)
    • Библиотека классов (HostingStartupLibrary)
  • Размещения при запуске активируется из сборки среды выполнения, развертываемой из хранилища (StartupDiagnostics). Сборка добавляет два ПО промежуточного слоя в приложение при запуске, предоставляя диагностические сведения о:
    • Зарегистрированные службы
    • Адрес (схема, узел, базовый путь, путь, строка запроса)
    • Подключение (удаленный IP-адрес, удаленный порт, локальный IP-адрес, локальный порт, сертификат клиента)
    • Заголовки запросов
    • Переменные среды

Запуск примера:

Активация из библиотеки классов

  1. Скомпилируйте пакет HostingStartupPackage с помощью команды dotnet pack.

  2. Добавьте имя сборки пакета HostingStartupPackage в переменную среды ASPNETCORE_HOSTINGSTARTUPASSEMBLIES.

  3. Скомпилируйте и запустите приложение. Ссылка на пакет появится в расширенном приложении (ссылка во время компиляции). Объект <PropertyGroup> в файле проекта приложения определяет выходные данные проекта пакета (../ HostingStartupPackage/bin/Debug) в качестве источника пакета. Это позволяет приложению использовать пакет без отправки пакета в nuget.org. Дополнительные сведения см. в заметках в файле проекта HostingStartupApp.

    <PropertyGroup>
      <RestoreSources>$(RestoreSources);https://api.nuget.org/v3/index.json;../HostingStartupPackage/bin/Debug</RestoreSources>
    </PropertyGroup>
    
  4. Обратите внимание, что ключевые значения конфигурации службы, отображаемой на индексной странице, соответствуют значениям, установленным с помощью метода пакета ServiceKeyInjection.Configure.

Если вы внесли изменения в проект HostingStartupPackage и перекомпилировали его, очистите локальные кэши пакета NuGet, чтобы убедиться, что HostingStartupApp получает обновленный пакет, а не устаревший пакет из локального кэша. Чтобы очистить локальные кэши NuGet, выполните следующую команду dotnet nuget locals:

dotnet nuget locals all --clear

Активации из библиотеки классов

  1. Скомпилируйте библиотеку классов HostingStartupLibrary с помощью команды dotnet build.

  2. Добавьте имя сборки библиотеки классов HostingStartupLibrary в переменную среды ASPNETCORE_HOSTINGSTARTUPASSEMBLIES.

  3. Разверните сборку библиотеки классов в папку bin приложения. Для этого скопируйте файл HostingStartupLibrary.dll из выходной папки компиляции библиотеки в папку bin/Debug приложения.

  4. Скомпилируйте и запустите приложение. <ItemGroup> в файле проекта приложения ссылается на сборку библиотеки класса (.\bin\Debug\netcoreapp3.0\HostingStartupLibrary.dll) (ссылка во время компиляции). Дополнительные сведения см. в примечаниях в файле проекта HostingStartupApp.

    <ItemGroup>
      <Reference Include=".\\bin\\Debug\\netcoreapp3.0\\HostingStartupLibrary.dll">
        <HintPath>.\bin\Debug\netcoreapp3.0\HostingStartupLibrary.dll</HintPath>
        <SpecificVersion>False</SpecificVersion> 
      </Reference>
    </ItemGroup>
    
  5. Обратите внимание, что ключевые значения конфигурации службы, отображаемой на индексной странице, соответствуют значениям, установленным с помощью метода библиотеки класса ServiceKeyInjection.Configure.

Активация из сборки среды выполнения, развернутой в хранилище

  1. Проект StartupDiagnostics использует PowerShell для изменения файла StartupDiagnostics.deps.json . PowerShell устанавливается по умолчанию в Windows начиная с Windows 7 с пакетом обновления 1 (SP1) и Windows Server 2008 R2 с пакетом обновления 1 (SP1). Для установки PowerShell на других платформах см. раздел Установка разных версий PowerShell.
  2. Выполните сценарий build.ps1, находящийся в папке RuntimeStore. Сценарий:
    • Генерирует пакет StartupDiagnostics в папке obj\packages.
    • Создает хранилище среды выполнения для StartupDiagnostics в папке store. Для размещения при запуске, развернутом в Windows, команда dotnet store в сценарии использует идентификатор среды выполнения (RID) win7-x64. При выполнении размещения при запуске для другой среды выполнения укажите соответствующий RID в строке 37 скрипта. Хранилище среды выполнения для StartupDiagnostics позже будет перемещено в хранилище среды выполнения пользователя или системы на компьютере, где будет израсходована сборка. Пользовательское место установки хранилища среды выполнения для сборки StartupDiagnostics — .dotnet/store/x64/netcoreapp3.0/startupdiagnostics/1.0.0/lib/netcoreapp3.0/StartupDiagnostics.dll.
    • Генерирует additionalDeps для StartupDiagnostics в папке additionalDeps. Дополнительные зависимости позднее будут перенесены в дополнительные зависимости пользователя или системы. Расположение установки .dotnet/x64/additionalDeps/StartupDiagnostics/shared/Microsoft.NETCore.App/3.0.0/StartupDiagnostics.deps.jsonдополнительных зависимостей пользователяStartupDiagnostics.
    • Размещает файл deploy.ps1 в папке для развертывания.
  3. Выполните сценарий deploy.ps1, находящийся в папке deployment. Скрипт добавляет:
    • StartupDiagnostics к переменной среды ASPNETCORE_HOSTINGSTARTUPASSEMBLIES.
    • Путь размещения начальных зависимостей (в папке развертывания проекта "RuntimeStore") к переменной среды DOTNET_ADDITIONAL_DEPS.
    • Путь хранилища среды выполнения (в папке развертывания проекта "RuntimeStore") к переменной среды DOTNET_SHARED_STORE.
  4. Выполните пример приложения.
  5. Запросите конечную точку /services для просмотра зарегистрированных служб приложения. Запросите конечную точку /diag для просмотра диагностических сведений.

Реализация IHostingStartup (размещение при запуске) позволяет добавлять в приложение улучшения из внешней сборки при запуске. Например, внешняя библиотека может использовать реализацию размещения при запуске, чтобы доставить дополнительные поставщики конфигурации или службы для приложения.

Просмотреть или скачать образец кода (описание загрузки)

Атрибут HostingStartup

Атрибут HostingStartup указывает на наличие начальной сборки размещения, которая будет активирована во время выполнения.

Входная сборка или сборка, содержащая класс Startup, автоматически сканируется на наличие атрибута HostingStartup. Список сборок, в котором будет выполняться поиск атрибута HostingStartup, загружается во время выполнения из конфигурации в WebHostDefaults.HostingStartupAssembliesKey. Список сборок, которые необходимо исключить из обнаружения, загружается из WebHostDefaults.HostingStartupExcludeAssembliesKey. Дополнительные сведения см. в разделах Веб-узел: начальные сборки размещения и Веб-узел: исключаемые сборки размещения при запуске.

В следующем примере пространство имен для начальной сборки размещения — StartupEnhancement. Класс, содержащий код запуска размещения, — StartupEnhancementHostingStartup:

[assembly: HostingStartup(typeof(StartupEnhancement.StartupEnhancementHostingStartup))]

Атрибут HostingStartup обычно находится в файле класса реализации начальной сборки размещения IHostingStartup.

Обнаружение загруженных начальных сборок размещения

Для обнаружения загруженных сборок размещения при запуске включите ведение журнала и проверьте журналы приложения. В журнал вносятся ошибки, возникающие при загрузке сборок. Загруженные начальные сборки размещения регистрируются на уровне отладки, также регистрируются все ошибки.

Отключение автоматической загрузки начальных сборок размещения

Чтобы отключить автоматическую загрузку начальных сборок размещения, используйте один из следующих подходов:

  • Чтобы предотвратить загрузку всех сборок запуска размещения, задайте одно из следующих элементовtrue:1
  • Чтобы предотвратить загрузку конкретных сборок запуска размещения, задайте одну из следующих строк с разделителями с запятой для размещения сборок запуска, чтобы исключить при запуске:

Если заданы параметры конфигурации узла и переменная среды, на поведение влияют параметры узла.

При отключении сборок размещения при запуске с использованием параметра узла или переменной среды сборка отключается на глобальном уровне, и также могут быть отключены некоторые характеристики приложения.

Project

Создайте размещение при запуске для любого из указанных ниже типов проектов:

Библиотека классов

Расширение размещения при запуске можно указать в библиотеке классов. Библиотека содержит атрибут HostingStartup.

Пример кода включает приложение Razor Pages HostingStartupApp и библиотеку классов HostingStartupLibrary. Библиотека классов:

  • Содержит класс размещения при запуске ServiceKeyInjection, который реализует IHostingStartup. ServiceKeyInjection добавляет пару строк службы в конфигурацию приложения с помощью поставщика конфигурации, размещаемой в памяти (AddInMemoryCollection).
  • Включает атрибут HostingStartup, определяющий пространство имен и класс размещения при запуске.

Метод ServiceKeyInjection класса Configure использует IWebHostBuilder для добавления улучшений в приложение.

HostingStartupLibrary/ServiceKeyInjection.cs:

[assembly: HostingStartup(typeof(HostingStartupLibrary.ServiceKeyInjection))]

namespace HostingStartupLibrary
{
    public class ServiceKeyInjection : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            builder.ConfigureAppConfiguration(config =>
            {
                var dict = new Dictionary<string, string>
                {
                    {"DevAccount_FromLibrary", "DEV_1111111-1111"},
                    {"ProdAccount_FromLibrary", "PROD_2222222-2222"}
                };

                config.AddInMemoryCollection(dict);
            });
        }
    }
}

Страница индекса приложения считывает и отображает значения конфигурации для двух ключей, устанавливаемых начальной сборкой размещения библиотеки класса:

HostingStartupApp/Pages/Index.cshtml.cs:

public class IndexModel : PageModel
{
    public IndexModel(IConfiguration config)
    {
        ServiceKey_Development_Library = config["DevAccount_FromLibrary"];
        ServiceKey_Production_Library = config["ProdAccount_FromLibrary"];
        ServiceKey_Development_Package = config["DevAccount_FromPackage"];
        ServiceKey_Production_Package = config["ProdAccount_FromPackage"];
    }

    public string ServiceKey_Development_Library { get; private set; }
    public string ServiceKey_Production_Library { get; private set; }
    public string ServiceKey_Development_Package { get; private set; }
    public string ServiceKey_Production_Package { get; private set; }

    public void OnGet()
    {
    }
}

Пример кода также включает проект пакета NuGet, предоставляющий отдельное размещение при запуске HostingStartupPackage. Характеристики пакета аналогичны характеристикам библиотеки классов, приведенным ранее. Пакет обладает следующими характеристиками:

  • Содержит класс размещения при запуске ServiceKeyInjection, который реализует IHostingStartup. ServiceKeyInjection добавляет пару строк службы в конфигурацию приложения.
  • Включает атрибут HostingStartup.

HostingStartupPackage/ServiceKeyInjection.cs:

[assembly: HostingStartup(typeof(HostingStartupPackage.ServiceKeyInjection))]

namespace HostingStartupPackage
{
    public class ServiceKeyInjection : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            builder.ConfigureAppConfiguration(config =>
            {
                var dict = new Dictionary<string, string>
                {
                    {"DevAccount_FromPackage", "DEV_3333333-3333"},
                    {"ProdAccount_FromPackage", "PROD_4444444-4444"}
                };

                config.AddInMemoryCollection(dict);
            });
        }
    }
}

Страница индекса приложения считывает и отображает значения конфигурации для двух ключей, устанавливаемых начальной сборкой размещения пакета:

HostingStartupApp/Pages/Index.cshtml.cs:

public class IndexModel : PageModel
{
    public IndexModel(IConfiguration config)
    {
        ServiceKey_Development_Library = config["DevAccount_FromLibrary"];
        ServiceKey_Production_Library = config["ProdAccount_FromLibrary"];
        ServiceKey_Development_Package = config["DevAccount_FromPackage"];
        ServiceKey_Production_Package = config["ProdAccount_FromPackage"];
    }

    public string ServiceKey_Development_Library { get; private set; }
    public string ServiceKey_Production_Library { get; private set; }
    public string ServiceKey_Development_Package { get; private set; }
    public string ServiceKey_Production_Package { get; private set; }

    public void OnGet()
    {
    }
}

Консольное приложение без точки входа

Этот подход может использоваться только для приложений .NET Core, но не для приложений .NET Framework.

Расширение динамического размещения при запуске, для активации которого не требуется ссылка во время компиляции, может быть реализовано в консольном приложении без точки входа, содержащем атрибут HostingStartup. При публикации консольного приложения создается начальная сборка размещения, которая может использоваться в хранилище среды выполнения.

В этом процессе используется консольное приложение без точки входа, так как:

  • Файл зависимостей необходим для функционирования размещения при запуске в начальной сборке размещения. Файл зависимостей является ресурсом исполняемого приложения, который создается путем публикации приложения, а не библиотеки.
  • Библиотеку невозможно добавить непосредственно в хранилище пакетов среды выполнения, для которого требуется запускаемый проект для общей среды выполнения.

В ходе создания динамического размещения при запуске:

  • Сборка запуска размещения создается из консольного приложения без точки входа:
    • содержит класс с реализацией IHostingStartup;
    • содержит атрибут HostingStartup для определения класса реализации IHostingStartup.
  • Консольное приложение публикуется для получения зависимостей начальной загрузки. После публикации консольного приложения неиспользуемые зависимости исключаются из файла зависимостей.
  • Файл зависимостей изменяется, чтобы задать расположение среды выполнения начальной сборки размещения.
  • Начальная сборка размещения и соответствующий файл зависимостей размещаются в хранилище пакетов среды выполнения. Чтобы можно было обнаружить начальную сборку размещения и ее файл зависимостей, они указываются в паре переменных среды.

Консольное приложение ссылается на пакет Microsoft.AspNetCore.Hosting.Abstractions:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" 
                      Version="2.1.1" />
  </ItemGroup>

</Project>

Атрибут HostingStartup определяет класс как реализацию IHostingStartup для загрузки и выполнения при построении IWebHost. В следующем примере используется пространство имен StartupEnhancement и класс StartupEnhancementHostingStartup:

[assembly: HostingStartup(typeof(StartupEnhancement.StartupEnhancementHostingStartup))]

Класс реализует IHostingStartup. Метод класса Configure использует IWebHostBuilder для добавления улучшений в приложение. IHostingStartup.Configure в начальной сборке размещения вызывается средой выполнения до Startup.Configure в пользовательском коде, что позволяет пользовательскому коду перезаписать конфигурацию, предоставленную начальной сборкой размещения.

namespace StartupEnhancement
{
    public class StartupEnhancementHostingStartup : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            // Use the IWebHostBuilder to add app enhancements.
        }
    }
}

При создании IHostingStartup проекта файл зависимостей (.deps.json) задает runtime расположение сборки в папку bin :

"targets": {
  ".NETCoreApp,Version=v2.1": {
    "StartupEnhancement/1.0.0": {
      "dependencies": {
        "Microsoft.AspNetCore.Hosting.Abstractions": "2.1.1"
      },
      "runtime": {
        "StartupEnhancement.dll": {}
      }
    }
  }
}

Показана только часть файла. Имя сборки в примере — StartupEnhancement.

Конфигурация, предоставляемая размещением при запуске

Существует два подхода к подготовке конфигурации в зависимости от того, какой конфигурацией вы хотите отдать приоритет — конфигурации размещения при запуске или конфигурации приложения:

  1. Задайте конфигурацию приложению, используя ConfigureAppConfiguration для загрузки конфигурации после выполнения делегатов приложения ConfigureAppConfiguration. При таком подходе конфигурация размещения при запуске будет иметь приоритет над конфигурацией приложения.
  2. Задайте конфигурацию приложению, используя UseConfiguration для загрузки конфигурации до выполнения делегатов приложения ConfigureAppConfiguration. При таком подходе конфигурация приложения будет иметь приоритет над конфигурацией размещения при запуске.
public class ConfigurationInjection : IHostingStartup
{
    public void Configure(IWebHostBuilder builder)
    {
        Dictionary<string, string> dict;

        builder.ConfigureAppConfiguration(config =>
        {
            dict = new Dictionary<string, string>
            {
                {"ConfigurationKey1", 
                    "From IHostingStartup: Higher priority " +
                    "than the app's configuration."},
            };

            config.AddInMemoryCollection(dict);
        });

        dict = new Dictionary<string, string>
        {
            {"ConfigurationKey2", 
                "From IHostingStartup: Lower priority " +
                "than the app's configuration."},
        };

        var builtConfig = new ConfigurationBuilder()
            .AddInMemoryCollection(dict)
            .Build();

        builder.UseConfiguration(builtConfig);
    }
}

Указание начальных сборок размещения

Для библиотеки класса или размещения при запуске с помощью консольного приложения укажите имя начальной сборки размещения в переменной среды ASPNETCORE_HOSTINGSTARTUPASSEMBLIES. Переменная среды — это список сборок, разделенный точками с запятой.

Только начальные сборки размещения проверяются на наличие атрибута HostingStartup. Для примера приложения HostingStartupApp необходимо установить следующее значение для переменной среды, чтобы обнаружить сборки размещения при запуске, описанные ранее:

HostingStartupLibrary;HostingStartupPackage;StartupDiagnostics

Начальную сборку размещения также можно задать с помощью параметра конфигурации узла Начальные сборки размещения.

При наличии нескольких начальных сборок размещения их методы Configure выполняются в порядке расположения сборок.

Активация

Ниже приведены варианты активации размещения при запуске:

  • Хранилище среды выполнения. Активация не требует ссылки на время компиляции для активации. Пример приложения помещает начальную сборку размещения и файлы зависимостей в папку deployment, чтобы облегчить развертывание размещения при запуске в среде с несколькими компьютерами. Папка deployment также включает сценарий PowerShell, который создает или изменяет переменные среды в системе развертывания, чтобы включить размещение при запуске.
  • Ссылка на время компиляции, необходимая для активации

Хранилище среды выполнения

Реализация размещения при запуске помещается в хранилище среды выполнения. Ссылка на сборку во время компиляции не требуется расширенному приложению.

После начальной сборки размещения создается хранилище среды выполнения с помощью файла манифеста проекта и команды dotnet store.

dotnet store --manifest {MANIFEST FILE} --runtime {RUNTIME IDENTIFIER} --output {OUTPUT LOCATION} --skip-optimization

В примере приложения (проект RuntimeStore) используется такая команда:

dotnet store --manifest store.manifest.csproj --runtime win7-x64 --output ./deployment/store --skip-optimization

Чтобы среда выполнения могла обнаружить хранилище среды выполнения, расположение хранилища среды выполнения добавляется к переменной среды DOTNET_SHARED_STORE.

Изменение и размещение файла зависимостей размещения при запуске

Чтобы активировать расширение без ссылки на пакет расширения, укажите дополнительные зависимости в среде выполнения с помощью additionalDeps. additionalDeps предоставляет следующие возможности:

  • Расширьте граф библиотеки приложения, предоставив набор дополнительных .deps.json файлов для слияния с собственным .deps.json файлом приложения при запуске.
  • Обнаруживать и скачивать начальную сборку размещения.

Рекомендуемые действия при создании файла дополнительных зависимостей.

  1. Выполните команду dotnet publish для файла манифеста хранилища среды выполнения, ссылка на который создавалась в предыдущем разделе.
  2. Удалите ссылку на манифест из библиотек и runtime раздел результирующего .deps.json файла.

В примере проекта свойство store.manifest/1.0.0 удаляется из разделов targets и libraries.

{
  "runtimeTarget": {
    "name": ".NETCoreApp,Version=v2.1",
    "signature": "4ea77c7b75ad1895ae1ea65e6ba2399010514f99"
  },
  "compilationOptions": {},
  "targets": {
    ".NETCoreApp,Version=v2.1": {
      "store.manifest/1.0.0": {
        "dependencies": {
          "StartupDiagnostics": "1.0.0"
        },
        "runtime": {
          "store.manifest.dll": {}
        }
      },
      "StartupDiagnostics/1.0.0": {
        "runtime": {
          "lib/netcoreapp2.1/StartupDiagnostics.dll": {
            "assemblyVersion": "1.0.0.0",
            "fileVersion": "1.0.0.0"
          }
        }
      }
    }
  },
  "libraries": {
    "store.manifest/1.0.0": {
      "type": "project",
      "serviceable": false,
      "sha512": ""
    },
    "StartupDiagnostics/1.0.0": {
      "type": "package",
      "serviceable": true,
      "sha512": "sha512-oiQr60vBQW7+nBTmgKLSldj06WNLRTdhOZpAdEbCuapoZ+M2DJH2uQbRLvFT8EGAAv4TAKzNtcztpx5YOgBXQQ==",
      "path": "startupdiagnostics/1.0.0",
      "hashPath": "startupdiagnostics.1.0.0.nupkg.sha512"
    }
  }
}

Поместите .deps.json файл в следующее расположение:

{ADDITIONAL DEPENDENCIES PATH}/shared/{SHARED FRAMEWORK NAME}/{SHARED FRAMEWORK VERSION}/{ENHANCEMENT ASSEMBLY NAME}.deps.json
  • {ADDITIONAL DEPENDENCIES PATH}: расположение, добавленное DOTNET_ADDITIONAL_DEPS в переменную среды.
  • {SHARED FRAMEWORK NAME}: общая платформа, необходимая для этого дополнительного файла зависимостей.
  • {SHARED FRAMEWORK VERSION}: минимальная версия общей платформы.
  • {ENHANCEMENT ASSEMBLY NAME}: имя сборки улучшения.

В примере приложения (проект RuntimeStore) файл дополнительных зависимостей помещается в следующее расположение:

deployment/additionalDeps/shared/Microsoft.AspNetCore.App/2.1.0/StartupDiagnostics.deps.json

Чтобы среда выполнения могла обнаружить хранилище среды выполнения, расположение файла дополнительных зависимостей добавляется к переменной среды DOTNET_ADDITIONAL_DEPS.

В примере приложения (проект RuntimeStore) для сборки хранилища среды выполнения и создания файла дополнительных зависимостей используется скрипт PowerShell.

Примеры установки переменных среды для различных операционных систем см. в разделе Использование нескольких сред.

Развертывание

Чтобы упростить развертывание размещения при запуске в среде с несколькими компьютерами, пример приложения создает в опубликованном результате папку deployment. Эта папка содержит:

  • Хранилище среды выполнения размещения при запуске.
  • Файл зависимостей размещения при запуске.
  • Скрипт PowerShell, который создает или изменяет ASPNETCORE_HOSTINGSTARTUPASSEMBLIES, DOTNET_SHARED_STORE и DOTNET_ADDITIONAL_DEPS для поддержки активации размещения при запуске. Запустите сценарий из командной строки PowerShell с правами администратора в системе развертывания.

Пакет NuGet

Расширение размещения при запуске можно указать в пакете NuGet. Пакет содержит атрибут HostingStartup. Типы размещения при запуске, предоставляемые пакетом, становятся доступными для приложения с использованием одного из следующих методов:

  • Файл проекта расширенного приложения создает ссылку на пакет для размещения при запуске в файле проекта приложения (ссылка во время компиляции). При наличии ссылки на время компиляции сборка запуска размещения и все его зависимости включаются в файл зависимостей приложения (.deps.json). Этот подход применяется к пакету начальной сборки размещения, опубликованному на nuget.org.
  • Файл зависимостей размещения при запуске становится доступным для расширенного приложения, как описано в разделе Хранилище среды выполнения (без ссылок во время компиляции).

Дополнительные сведения о пакетах NuGet и хранилище среды выполнения см. в разделах:

Папка bin проекта

Расширение размещения при запуске может быть представлено сборкой, разворачиваемой в папке bin расширенного приложения. Типы размещения при запуске, предоставляемые сборкой, становятся доступными для приложения с использованием одного из следующих методов:

  • Файл проекта расширенного приложения создает ссылку сборки на размещение при запуске (ссылка во время компиляции). При наличии ссылки на время компиляции сборка запуска размещения и все его зависимости включаются в файл зависимостей приложения (.deps.json). Этот подход применяется при вызове сценария развертывания ссылки на сборку запуска размещения (.dll файл) и перемещение сборки в любой из следующих вариантов:
    • Проект, который будет использовать ее.
    • Расположение, доступное использующему проекту.
  • Файл зависимостей размещения при запуске становится доступным для расширенного приложения, как описано в разделе Хранилище среды выполнения (без ссылок во время компиляции).
  • При выборе платформа .NET Framework сборка загружается в контексте загрузки по умолчанию, что на платформа .NET Framework означает, что сборка находится в любом из следующих расположений:
    • Базовый путь приложения: папка bin , в которой находится исполняемый файл приложения (.exe).
    • Глобальный кэш сборок (GAC): GAC хранит сборки, к которым совместно используются несколько приложений платформа .NET Framework. Дополнительные сведения см. в статье "Практическое руководство. Установка сборки в глобальный кэш сборок" в документации по платформа .NET Framework.

Пример кода

В примере кода (инструкции по скачиванию примера) показаны сценарии реализации размещения при запуске:

  • Две сборки запуска (библиотеки классов) задают пару пар конфигурации key-value в памяти:
    • Пакет NuGet (HostingStartupPackage)
    • Библиотека классов (HostingStartupLibrary)
  • Размещения при запуске активируется из сборки среды выполнения, развертываемой из хранилища (StartupDiagnostics). Сборка добавляет два ПО промежуточного слоя в приложение при запуске, предоставляя диагностические сведения о:
    • Зарегистрированные службы
    • Адрес (схема, узел, базовый путь, путь, строка запроса)
    • Подключение (удаленный IP-адрес, удаленный порт, локальный IP-адрес, локальный порт, сертификат клиента)
    • Заголовки запросов
    • Переменные среды

Запуск примера:

Активация из библиотеки классов

  1. Скомпилируйте пакет HostingStartupPackage с помощью команды dotnet pack.

  2. Добавьте имя сборки пакета HostingStartupPackage в переменную среды ASPNETCORE_HOSTINGSTARTUPASSEMBLIES.

  3. Скомпилируйте и запустите приложение. Ссылка на пакет появится в расширенном приложении (ссылка во время компиляции). Объект <PropertyGroup> в файле проекта приложения определяет выходные данные проекта пакета (../ HostingStartupPackage/bin/Debug) в качестве источника пакета. Это позволяет приложению использовать пакет без отправки пакета в nuget.org. Дополнительные сведения см. в заметках в файле проекта HostingStartupApp.

    <PropertyGroup>
      <RestoreSources>$(RestoreSources);https://api.nuget.org/v3/index.json;../HostingStartupPackage/bin/Debug</RestoreSources>
    </PropertyGroup>
    
  4. Обратите внимание, что ключевые значения конфигурации службы, отображаемой на индексной странице, соответствуют значениям, установленным с помощью метода пакета ServiceKeyInjection.Configure.

Если вы внесли изменения в проект HostingStartupPackage и перекомпилировали его, очистите локальные кэши пакета NuGet, чтобы убедиться, что HostingStartupApp получает обновленный пакет, а не устаревший пакет из локального кэша. Чтобы очистить локальные кэши NuGet, выполните следующую команду dotnet nuget locals:

dotnet nuget locals all --clear

Активации из библиотеки классов

  1. Скомпилируйте библиотеку классов HostingStartupLibrary с помощью команды dotnet build.

  2. Добавьте имя сборки библиотеки классов HostingStartupLibrary в переменную среды ASPNETCORE_HOSTINGSTARTUPASSEMBLIES.

  3. Разверните сборку библиотеки классов в папку bin приложения. Для этого скопируйте файл HostingStartupLibrary.dll из выходной папки компиляции библиотеки в папку bin/Debug приложения.

  4. Скомпилируйте и запустите приложение. <ItemGroup> в файле проекта приложения ссылается на сборку библиотеки класса (.\bin\Debug\netcoreapp2.1\HostingStartupLibrary.dll) (ссылка во время компиляции). Дополнительные сведения см. в примечаниях в файле проекта HostingStartupApp.

    <ItemGroup>
      <Reference Include=".\\bin\\Debug\\netcoreapp2.1\\HostingStartupLibrary.dll">
        <HintPath>.\bin\Debug\netcoreapp2.1\HostingStartupLibrary.dll</HintPath>
        <SpecificVersion>False</SpecificVersion>
      </Reference>
    </ItemGroup>
    
  5. Обратите внимание, что ключевые значения конфигурации службы, отображаемой на индексной странице, соответствуют значениям, установленным с помощью метода библиотеки класса ServiceKeyInjection.Configure.

Активация из сборки среды выполнения, развернутой в хранилище

  1. Проект StartupDiagnostics использует PowerShell для изменения файла StartupDiagnostics.deps.json . PowerShell устанавливается по умолчанию в Windows начиная с Windows 7 с пакетом обновления 1 (SP1) и Windows Server 2008 R2 с пакетом обновления 1 (SP1). Для установки PowerShell на других платформах см. раздел Установка разных версий PowerShell.
  2. Выполните сценарий build.ps1, находящийся в папке RuntimeStore. Сценарий:
    • Генерирует пакет StartupDiagnostics в папке obj\packages.
    • Создает хранилище среды выполнения для StartupDiagnostics в папке store. Для размещения при запуске, развернутом в Windows, команда dotnet store в сценарии использует идентификатор среды выполнения (RID) win7-x64. При выполнении размещения при запуске для другой среды выполнения укажите соответствующий RID в строке 37 скрипта. Хранилище среды выполнения для StartupDiagnostics позже будет перемещено в хранилище среды выполнения пользователя или системы на компьютере, где будет израсходована сборка. Пользовательское место установки хранилища среды выполнения для сборки StartupDiagnostics — .dotnet/store/x64/netcoreapp2.2/startupdiagnostics/1.0.0/lib/netcoreapp2.2/StartupDiagnostics.dll.
    • Генерирует additionalDeps для StartupDiagnostics в папке additionalDeps. Дополнительные зависимости позднее будут перенесены в дополнительные зависимости пользователя или системы. Расположение установки .dotnet/x64/additionalDeps/StartupDiagnostics/shared/Microsoft.NETCore.App/2.2.0/StartupDiagnostics.deps.jsonдополнительных зависимостей пользователяStartupDiagnostics.
    • Размещает файл deploy.ps1 в папке для развертывания.
  3. Выполните сценарий deploy.ps1, находящийся в папке deployment. Скрипт добавляет:
    • StartupDiagnostics к переменной среды ASPNETCORE_HOSTINGSTARTUPASSEMBLIES.
    • Путь размещения начальных зависимостей (в папке развертывания проекта "RuntimeStore") к переменной среды DOTNET_ADDITIONAL_DEPS.
    • Путь хранилища среды выполнения (в папке развертывания проекта "RuntimeStore") к переменной среды DOTNET_SHARED_STORE.
  4. Выполните пример приложения.
  5. Запросите конечную точку /services для просмотра зарегистрированных служб приложения. Запросите конечную точку /diag для просмотра диагностических сведений.