Подтвердить что ты не робот

VS2017 Скомпилировать NetCoreApp как EXE

Я создал NetCoreApp (v1.1) в Visual Studio 2017. Когда я его компилирую, я получаю DLL, созданную вместо ожидаемого EXE для встроенного проекта. Я проверил файл csproj и подтвердил, что тип вывода установлен на exe, но не на кости.

Любые идеи, почему VS2017 все еще создает DLL? Я уверен, что это место, где я забыл... его также 1 AM.:)

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <PlatformTarget>AnyCPU</PlatformTarget>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\Core.EF.SqlServer\Core.EF.SqlServer.csproj" />
  </ItemGroup>

</Project>
4b9b3361

Ответ 1

Обновление 2019:

.NET Core 3. 0+ проекты теперь будут включать исполняемый файл для платформы, на которой вы строите по умолчанию. Это просто исполняемый файл shim, и ваша основная логика все еще находится в файле .dll.

Но в .NET Core 3.0 также появились однофайловые развертывания, поэтому развертывание осуществляется с помощью

dotnet publish -r win-x64 -p:PublishSingleFile=True --self-contained false

создаст один файл .exe, содержащий все ваши зависимости. Вы можете изменить --self-contained на true, чтобы он также включал .NET Core Runtime, так что .NET Core не нужно устанавливать глобально на целевой машине.

Оригинал

Предполагается, что приложения .NET Core - это файлы .dll. OutputType, установленный на Exe, в данном случае означает "исполняемый" и делает все необходимое для обеспечения работоспособности вывода (точка входа из метода Main(), файл .runtimeconfig.json). Полученный файл DLL предназначен для запуска с использованием:

dotnet yourapp.dll 

Этот файл dll работает на всех платформах, которые поддерживаются средой выполнения .net(windows, linux, macOS). Это называется "переносимым" или "зависимым от фреймворка" развертыванием.

Если вы действительно хотите файл .exe, рассмотрите возможность автономного развертывания. Это создаст выходные данные, которые будут содержать собственную копию среды выполнения ядра .net и файла yourapp.exe, но это также увеличит размер опубликованного приложения и его необходимо будет обновлять при выпуске новых версий среды выполнения. Кроме того, полученное приложение работает только в операционной системе, опубликованной для.

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

Ответ 2

в VS2017

  1. Щелкните правой кнопкой мыши свой проект и выберите "Опубликовать" (в VS2019 нажмите "Создать" → "Опубликовать")
  2. .Выберите "Папка" и создайте новый профиль
  3. На вкладке "Опубликовать" нажмите "Настроить..."
  4. Выберите режим развертывания: автономный, время выполнения цели: win-x86 (или win-x64)
  5. Сохранить
  6. Опубликовать

в папке\bin\Debug\netcoreapp2.1\win-x86\вы увидите EXE файл

Publish settings

Ответ 3

Начиная с .NET Core 2.2, вы можете создавать зависимые от платформы исполняемые файлы

Хотя создание автономного развертывания может быть хорошим решением, оно имеет свои недостатки. (См. ответы Р.Титова и Мартина Уллрихса на SCD-ов.)

К счастью,.NET Core 2.2 поддерживает создание так называемых Framework-Dependent Executable-s, которые по сути являются двоичным файлом-оболочкой (.exe для windows) вокруг стандартного dll-s.

Таким образом, у вас есть все преимущества (и недостатки) стандартного Framework-зависимого развертывания (опять же, см. ответ мартина), но у вас есть удобный способ запустить его, не имея чтобы вызвать его через CLI dotnet.

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

dotnet publish -c Release -r <RID> --self-contained false

где RID - это обычный идентификатор времени выполнения, например win-x64 или какую-либо платформу, для которой вы хотите построить (см. Каталог здесь).

Ответ 4

Это то, как вы делаете самостоятельную -c публикацию с помощью командной строки в любой ОС: dotnet publish C:\src\App\App.csproj -c выпуск -r win-x64 -o output-win-x64

Кроме того, вам может потребоваться уменьшить объем вывода с типичных ~ 60 МБ для простого приложения Hello World до ~ 30 МБ с помощью ILLink.

Кроме того, вы можете пойти дальше и получить один файл.exe размером около 5 Мб и использовать ILCompiler. Смотрите этот ответ.

Ответ 5

Другие ответы хороши, но иногда мне кажется удобным:

  • Он не должен быть автономным, потому что на целевой машине, скорее всего, установлено ядро .net правильной версии. Это сокращает количество DLL, которые мне нужно отправить.
  • Не нужно указывать dotnet в командной строке

Для этого можно использовать оболочку bat файла, подобную этим:

@ECHO OFF
REM see http://joshua.poehls.me/powershell-batch-file-wrapper/

SET SCRIPTNAME=%~d0%~p0%~n0.dll
SET ARGS=%*

dotnet "%SCRIPTNAME%" %ARGS%
EXIT /B %ERRORLEVEL%

Если ваше приложение заканчивается в yourapp.dll назовите bat файл yourapp.bat и поместите его рядом с dll. Теперь вместо dotnet yourapp.dll params вы можете называть yourapp params

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