Публикация приложений .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>net8.0</TargetFramework>, создается двоичный файл, предназначенный для .NET 8. TFM, указанный в этом параметре, является целевым объектом по умолчанию, используемым командой dotnet publish.

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

Значение по умолчанию для режима BUILD-CONFIGURATIONОтладка, если с помощью параметра -c не задано иное.

По умолчанию используется ./bin/<BUILD-CONFIGURATION>/<TFM>/publish/выходной каталог dotnet publish команды. Например dotnet publish -c Release -f net8.0 публикует в ./bin/Release/net8.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 Core 8, на любом компьютере, на котором работает ваше приложение, должно быть установлено время выполнения .NET Core 8. Как уже говорилось в разделе Основы публикации, можно изменить файл проекта для изменения целевой платформы по умолчанию или для выбора нескольких платформ.

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

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

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

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

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

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

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

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

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

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

Примечание.

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

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

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

При публикации SCD создается приложение, которое не будет автоматически использовать новейшую версию исправлений безопасности .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.

См. также