Поделиться через


Публикация приложений .NET с помощью интерфейса командной строки

В этой статье показано, как опубликовать приложение .NET из командной строки. .NET предоставляет три способа публикации приложений. Зависимое от платформы развертывание создает кроссплатформенный DLL-файл, который использует локально установленную среду выполнения .NET. Исполняемый файл, зависящий от платформы, создает конкретный для платформы исполняемый файл, который использует локально установленную среду выполнения .NET. Автономный исполняемый файл создает зависимый от платформы исполняемый файл и включает локальную копию среды выполнения .NET.

Общие сведения о режимах развертывания см. в статье Общие сведения о публикации приложений .NET.

Нужна быстрая помощь по работе с командной строкой? В следующей таблице показаны некоторые примеры публикации приложений. Вы можете указать целевую платформу с помощью параметра -f <TFM> или путем редактирования файла проекта. Дополнительные сведения см. в статье Основы публикации.

Режим публикации Команда (приказ)
Развертывание, зависящее от платформы dotnet publish -c Release -p:UseAppHost=false
Исполняемый файл, зависящий от фреймворка dotnet publish -c Release -r <RID> --self-contained false
dotnet publish -c Release
Автономное развертывание dotnet publish -c Release -r <RID> --self-contained true

Примечание.

  • Параметр -c Release не является обязательным. Он предоставляется в виде напоминания о публикации релизной сборки вашего приложения.
  • В пакете SDK для .NET версии 3.1 или выше зависящий от платформы исполняемый файл является режимом публикации по умолчанию при выполнении основной dotnet publish команды.

Основы публикации

Параметр <TargetFramework> файла проекта указывает целевую платформу по умолчанию при публикации приложения. Можно изменить целевую среду на любой допустимый моникер целевой среды (TFM). Например, если проект использует <TargetFramework>net9.0</TargetFramework>, создается двоичный файл, предназначенный для .NET 9. TFM, указанный в этом параметре, является целевым объектом по умолчанию, используемым командой dotnet publish.

Если вам нужно охватить несколько платформ, можно задать в параметре <TargetFrameworks> несколько значений TFM, разделенных точками с запятой. При создании приложения создается сборка для каждой целевой платформы. Но при публикации приложения необходимо указать целевую платформу с помощью команды dotnet publish -f <TFM>.

Режим BUILD-CONFIGURATION по умолчанию — Релиз, если он не изменён с помощью параметра -c.

Каталог по умолчанию для команды dotnet publish — это ./bin/<BUILD-CONFIGURATION>/<TFM>/publish/. Например, dotnet publish -c Release -f net9.0 публикует в ./bin/Release/net9.0/publish/. Однако вы можете выбрать упрощенный выходной путь и структуру папок для всех выходных данных сборки. Дополнительные сведения см.: Макет выводимых артефактов.

Нативные зависимости

Если приложение имеет машинные зависимости, оно не может выполняться в другой операционной системе. Например, если приложение использует нативный интерфейс Windows API, оно не будет работать в macOS или Linux. Необходимо написать код для конкретной платформы и скомпилировать исполняемый файл для каждой платформы.

Учтите также, что если в библиотеке, на которую вы ссылаетесь, есть родная зависимость, ваше приложение может не выполняться на всех платформах. Тем не менее возможно, что пакет NuGet, на который вы ссылаетесь, включает версии для конкретных платформ, которые обрабатывают необходимые нативные зависимости за вас.

При распространении приложения с нативными зависимостями может понадобиться использовать dotnet publish -r <RID> для указания целевой платформы, на которую вы хотите выполнить публикацию. Список идентификаторов сред выполнения см. в каталоге идентификаторов сред выполнения.

Дополнительные сведения о двоичных файлах для определенной платформы см. в разделах Исполняемый файл, зависящий от платформы и Автономное развертывание.

Пример приложения

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

mkdir apptest1
cd apptest1
dotnet new console
dotnet add package Figgle

Файл Program.cs или Program.vb, созданный с помощью шаблона консоли, необходимо изменить на следующее:

using System;

namespace apptest1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Figgle.FiggleFonts.Standard.Render("Hello, World!"));
        }
    }
}
Module Program
    Sub Main(args As String())
        Console.WriteLine(Figgle.FiggleFonts.Standard.Render("Hello, World!"))
    End Sub
End Module

При выполнении приложения (dotnet run) отображается следующий результат:

  _   _      _ _         __        __         _     _ _
 | | | | ___| | | ___    \ \      / /__  _ __| | __| | |
 | |_| |/ _ \ | |/ _ \    \ \ /\ / / _ \| '__| |/ _` | |
 |  _  |  __/ | | (_) |    \ V  V / (_) | |  | | (_| |_|
 |_| |_|\___|_|_|\___( )    \_/\_/ \___/|_|  |_|\__,_(_)
                     |/

Развертывание, зависящее от платформы

При публикации приложения в качестве FDD файл <PROJECT-NAME>.dll создается в папке ./bin/<BUILD-CONFIGURATION>/<TFM>/publish/. Чтобы запустить приложение, перейдите к папке выходных данных и используйте команду dotnet <PROJECT-NAME>.dll.

Ваше приложение будет настроено для конкретной версии .NET. Целевую среду выполнения .NET необходимо установить на компьютер, на котором будет запущено приложение. Например, если приложение предназначено для .NET 9, любой компьютер, на котором работает ваше приложение, должен установить среду выполнения .NET 9. Как уже говорилось в разделе Основы публикации, можно изменить файл проекта для изменения целевой платформы по умолчанию или для выбора нескольких платформ.

При публикации FDD создается приложение, которое автоматически обновляется до последней версии исправления безопасности .NET, доступного в системе, где выполняется это приложение. Дополнительные сведения о привязке версий во время компиляции см. в разделе Выбор версии .NET для использования.

Режим публикации Команда (приказ)
Развертывание, зависящее от платформы dotnet publish -c Release -p:UseAppHost=false

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

Исполняемый файл, зависящий от фреймворка (FDE), — это режим по умолчанию для базовой dotnet publish команды. Не нужно указывать другие параметры, если вы хотите работать в текущей операционной системе.

В этом режиме создается исполняемый хост, специфичный для платформы, для размещения вашего кроссплатформенного приложения. Этот режим аналогичен FDD, так как для FDD требуется хост в виде команды dotnet. Имя исполняемого файла основного приложения зависит от платформы и обычно похоже на <PROJECT-FILE>.exe. Вы можете запустить этот исполняемый файл напрямую вместо вызова метода dotnet <PROJECT-FILE>.dll, который по-прежнему допустим для запуска приложения.

Ваше приложение будет настроено для конкретной версии .NET. Целевую среду выполнения .NET необходимо установить на компьютер, на котором будет запущено приложение. Например, если приложение предназначено для .NET 9, любой компьютер, на котором работает ваше приложение, должен установить среду выполнения .NET 9. Как уже говорилось в разделе Основы публикации, можно изменить файл проекта для изменения целевой платформы по умолчанию или для выбора нескольких платформ.

Публикация FDE создает приложение, которое автоматически обновляется до последней версии исправлений безопасности .NET, доступной в системе, где выполняется приложение. Дополнительные сведения о привязке версий во время компиляции см. в разделе Выбор версии .NET для использования.

Режим публикации Команда (приказ)
Исполняемый файл, зависящий от фреймворка dotnet publish -c Release -r <RID> --self-contained false
dotnet publish -c Release

При использовании параметра -r путь к папке выходных данных изменяется на ./bin/<BUILD-CONFIGURATION>/<TFM>/<RID>/publish/

Если вы используете пример приложения, запустите dotnet publish -f net9.0 -r win-x64 --self-contained false. Эта команда создает следующий исполняемый файл: ./bin/Debug/net9.0/win-x64/publish/apptest1.exe

Примечание.

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

Настройка поведения поиска установки .NET

В .NET 9 и более поздних версиях можно настроить пути поиска установки для опубликованного исполняемого файла .NET с помощью свойств AppHostDotNetSearch и AppHostRelativeDotNet.

AppHostDotNetSearch позволяет указать одно или несколько расположений, где исполняемый файл будет искать установку .NET:

AppHostRelativeDotNet указывает путь относительно исполняемого файла, который будет искаться, когда AppHostDotNetSearch содержит AppRelative.

Дополнительные сведения см. в разделе AppHostDotNetSearch, AppHostRelativeDotNet, а также параметры расположения установки в apphost.

Автономное развертывание

При публикации автономного развертывания (SCD) пакет SDK для .NET создает исполняемый файл для конкретной платформы. Публикация SCD включает все необходимые файлы .NET для запуска приложения, но не включает собственные зависимости .NET (например, для .NET 8 в Linux). Эти зависимости должны присутствовать в системе перед запуском приложения.

При публикации SCD создается приложение, которое не обновляется до последней доступной версии пакета обновления безопасности .NET. Дополнительные сведения о привязке версий во время компиляции см. в разделе Выбор версии .NET для использования.

Необходимо использовать следующие переключатели с командой dotnet publish для публикации SCD.

  • -r <RID>

    Этот переключатель использует идентификатор (RID) для указания целевой платформы. Список идентификаторов сред выполнения см. в каталоге идентификаторов сред выполнения.

  • --self-contained true

    Этот параметр сообщает пакету SDK для .NET создать исполняемый файл в качестве SCD.

Режим публикации Команда (приказ)
Автономное развертывание dotnet publish -c Release -r <RID> --self-contained true

Совет

  • В .NET 6 и более поздних версиях можно уменьшить общий размер совместимых автономных приложений, публикуя обрезанные. Это позволяет триммеру удалять части платформы и ссылающиеся сборки, которые не находятся ни на каком пути кода или потенциально ссылаются в отражении среды выполнения. См. несовместимости обрезки, чтобы определить, имеет ли обрезка смысл для вашего приложения.
  • Можно уменьшить размер развертывания, включив инвариантный режим глобализации. Этот режим подходит для приложений, которые не учитывают глобальные настройки и могут использовать соглашения о форматировании, соглашения о регистре, сравнение строк и порядок сортировки инвариантной культуры. Дополнительные сведения об инвариантном режиме глобализации и том, как его включить, см. в статье об инвариантном режиме глобализации .NET Core.

См. также