Right way to publish WinUI3 app in single .exe file

2.9k views Asked by At

I have created a project in winui3, however, I just can't find a way to publish the application into a single .exe file.

  • When I use the JetBrains rider to publish single .exe file, it just doesn't start.

  • While, packaged application published using visual studios, doesn't start the application by clicking on .exe file but by only through visual studio.

  • And in unpackaged publish, .exe file (still not single file) do runs, but most of my assets doesn't load and throws error while executing this line of code

AppNotificationManager.Default.Show(new AppNotificationBuilder().AddText("Text").BuildNotification());

Some requirements I have:

  • After publishing, a single .exe file is generated, that I can share or upload somewhere, without any other dependencies.
  • My application uses task scheduler to run itself through Environment.ProcessPath in another instance. So, it'll be necessary that the app runs through .exe file.
  • Sending notification is optional, and I am willing to publish my app without that.

Other than this, I have seen the Microsoft's PowerToys application, and I am pretty sure that too is made in winui3, and they somehow managed to provide a single .exe on their github page.

If anyone can please help me with this, I'll be very grateful.

TLDR: How to generate single .exe file in winui3 which runs

1

There are 1 answers

3
Andrew KeepCoding On

First of all, at this moment at least, you can't create a single file EXE for WinUI 3. PowerToys is not an exception and I guess you are talking about its installer.

What you can do is these 2 configurations. The videos are from my channel, if you are interested in.

  • Make your app non-packaged (unpackaged) and self-contained. (video)

  • Reduce unnecessary folders in the output folder. (video)

TLDR: Your *.csproj should have these lines:

<Project ...>
  <PropertyGroup>

    ...

    <WindowsPackageType>None</WindowsPackageType>
    <WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
  </PropertyGroup>

  ...

  <Target Name="RemoveFoldersWithMuiFiles" AfterTargets="Build">
    <ItemGroup>
      <RemovingFiles Include="$(OutDir)*\*.mui" Exclude="$(OutDir)en-us\*.mui" />
      <RemovingFolders Include="@(RemovingFiles->'%(RootDir)%(Directory)')" />
    </ItemGroup>
    <RemoveDir Directories="@(RemovingFolders)" />
  </Target>
</Project>