Publish .NET Core App As Portable Executable

.net-core, c#, portable-executable, publish, self-contained

Solution

.NET Core 3.0

.NET Core 3.0 supports it out of the box. It packs all stuff in one `.exe` file (~68 MB for a basic console app). There is `PublishTrimmed=true` option that can decrease size to ~28 MB by analyzing static code references and excluding unused framework assemblies from the final build.

To configure `single exe` build edit your `csproj` file:

<PropertyGroup>
  <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  <PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>

or on the command line in a folder with `csproj` file:

dotnet publish -r win-x64 -p:PublishSingleFile=true

For more details see a great answer given by Gopi.

Standalone utils

`Warp` (thanks to Darien Shannon for mentioning it in the comment) and `dotnet CoreRT`. Both work with previous versions of .Net Core also

Warp

It is a tool similar to ILMerge for the classic `.NET Framework`. It is very easy to use. For the basic console app, It can produce `.exe` ~35 MB without tree shaker and around 10-15 MB with tree shaker.

Dotnet CoreRT

As of Jan 2022 this project is superseded by NativeAOT experiment in dotnet/runtimelab repo. Thanks to @t.j.

For now, you can try to pre-compile the application into a native single-file executable using `dotnet CoreRT` project. I'm saying "try" because documentation says:

This project is in the early stages of its development.

Nevertheless, it works at least for simple applications. See the sample here. According to its description, you need to run the following command in the project folder:

dotnet new nuget 

This will add a nuget.config file to your application. Open the file and in the element under add the following:

<add key="dotnet-core" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />

Then run this:

dotnet add package Microsoft.DotNet.ILCompiler -v 1.0.0-alpha-* 

Then run this:

dotnet publish -r win-x64 -c release

Once completed, you can find the native executable in the root folder of your project under /bin/x64//netcoreapp2.0/publish/

Problem

I have a simple .net core app and publish it by following command: ``` dotnet publish -c Release -r win10-x64 ``` SqlLocalDbStarter.csproj ``` <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.1</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Win32.Registry" Version="4.5.0" /> </ItemGroup> </Project> ``` When publish process finished dotnet create `win10-x64` folder at `bin\Release` folder then after open it the folder contains `publish` folder and some dll and exe files. There are some issue for me: - Which one of `exe` files (inside / outside publish folder) i need to PE app? - Why when i cut `exe` file and move it in other place it doesn't run (without message)? - If I need all of `dll` files to run application, so there are tow options for me (inside / outside publish folder), inside publish folder size is 66 MB but outside publish folder is 1 MB. - I want to have a one `exe` file to run my program without dll files.

Original source