# .NET Single File Executable
**.NET executable projects can be published into a single file using `PublishSingleFile` MSBuild property, which allows you to easily distribute the application as a single file. Single-file applications are always OS and architecture-specific.**
**Single file deployment is available for both framework-dependent and self-contained applications.** Single file and self-contained deployment features are independent, meaning that one does not impact the other. For more information about the difference between the two models see [[Shared vs. Self-Contained Dotnet Deployments|Shared vs. Self-Contained .NET Deployments]].
## Running and Extracting Files
**In .NET 5, by default, all .NET assemblies are combined into a single file, and the assembly is started without needing to extract individual files. This is not the case with .NET Core 3.0, where assemblies had to be extracted to a temp directory first.**
Note that any native dependencies are by default still published next to the managed dll, although this behavior can be overridden using `IncludeNativeLibrariesForSelfExtract`. The default was chosen to ensure a good debugging experience, which requires that native files are accessed directly (this is according to the docs, unsure exactly why this is the case).
## Drawbacks
**Some .NET APIs are not compatible with single-file deployments. This also applies to any dependencies your files will have, so if you use single-file deployment more intensive runtime tests are needed.**
**The most common problems are APIs related to dll file paths, and APIs that use relative file paths of other files shipped with the application.**
Here are some examples from .NET docs along with some suggestion for fixes to common problems below.
| API                            | Behavior with single-file deployment                       |
| ------------------------------ | ---------------------------------------------------------- |
| `Assembly.Location`            | Returns an empty string.                                   |
| `Module.FullyQualifiedName`    | Returns a string with the value of or throws an exception. |
| `Module.Name`                  | Returns a string with the value of `<Unknown>`             |
| `Assembly.GetFile`             | Throws `IOException`.                                      |
| `Assembly.GetFiles`            | Throws `IOException`.                                      |
| `Assembly.CodeBase`            | Throws `PlatformNotSupportedException`.                    |
| `Assembly.EscapedCodeBase`     | Throws `PlatformNotSupportedException`.                    |
| `AssemblyName.CodeBase`        | Returns null.                                              |
| `AssemblyName.EscapedCodeBase` | Returns null.                                              |
Fixes to common problems:
- For a safe way of getting the path to the current assembly see [[Getting the Path to Executing Assembly]]
- Consider avoiding similar problems with embedded resources (see [[Accessing Embedded Resources]]).
## MSBuild Properties
| Property                               | Description                                                                             |
| -------------------------------------- | --------------------------------------------------------------------------------------- |
| `PublishSingleFile`                    | Enables single file deployment                                                          |
| `IncludeNativeLibrariesForSelfExtract` | Bundle native libraries. They will be extracted to temp before the app is ran.          |
| `IncludeAllContentForSelfExtract`      | Will cause all files to be extracted before running the app. Matches previous behavior. |                                       |                                                                                         |
(to use these without modifying csproj you can pipe them directly to a dotnet call e.g. `dotnet publish -p PublishSingleFile=true --sc`. `--sc` stands for single-executable).)
## Sources
- [[Single File Application - .NET]]