microsoft/aspire · error · InvalidOperationException

Unable to determine current CLI location.

Error message

Unable to determine current CLI location.

What it means

Thrown when constructing/executing the archive-based self-update path and `Environment.ProcessPath` (provided by the process path provider) is null or empty, so the CLI cannot locate its own executable to replace in place. Without the current executable path a same-directory replacement is impossible, so the update aborts with an InvalidOperationException.

Solutions

  1. Run the official `aspire` executable directly rather than through a wrapper script or launcher
  2. Upgrade the CLI using the platform installer instead of `--self` archive update
  3. Check that Environment.ProcessPath is non-empty in your host environment; report a CLI bug if it is empty in a normal launch
Defensive patterns

Strategy: try-catch

Validate before calling

var exePath = Environment.ProcessPath;
if (string.IsNullOrEmpty(exePath))
    Console.Error.WriteLine("Cannot self-update: process path unavailable; use the installer instead.");

Type guard

bool canSelfUpdate => !string.IsNullOrEmpty(Environment.ProcessPath);

Try / catch

try { await UpdateSelfAsync(); }
catch (InvalidOperationException ex) when (ex.Message.Contains("Unable to determine current CLI location"))
{ Console.Error.WriteLine("Use the platform installer script instead of --self."); }

Prevention

When it happens

Trigger: Running `aspire update --self` in an environment where the process path cannot be determined — e.g. exotic hosts, embedded/redirected launches, or wrapper processes that do not expose the real executable path.

Common situations: Running the CLI through unusual launchers, sandboxed environments that hide the executable path, or custom builds where the process path provider is stubbed.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


AI-assisted analysis of microsoft/aspire@25830f84bd (2026-09-16). Data as JSON: /api/errors/6f201722a595617e. Report an issue: GitHub.

Appendix: source

Thrown at src/Aspire.Cli/Commands/UpdateCommand.cs:755

            return CommandResult.Cancelled();
        }
        catch (Exception ex)
        {
            Telemetry.RecordError("Failed to update CLI", ex);
            var errorMessage = $"Failed to update CLI: {ex.Message}";
            return CommandResult.Failure(CliExitCodes.InvalidCommand, errorMessage);
        }
    }

    private async Task ExtractAndUpdateAsync(string archivePath, string channel, CancellationToken cancellationToken)
    {
        // Archive self-update is a same-directory replacement, not an installer that searches
        // for a writable fallback. If the executable is package-manager-owned, installing
        // elsewhere would leave the user's PATH/profile pointing at the old package-managed CLI.
        var currentExePath = _processPathProvider.ProcessPath;
        if (string.IsNullOrEmpty(currentExePath))
        {
            throw new InvalidOperationException("Unable to determine current CLI location.");
        }

        var installDir = Path.GetDirectoryName(currentExePath);
        if (string.IsNullOrEmpty(installDir))
        {
            throw new InvalidOperationException($"Unable to determine installation directory from: {currentExePath}");
        }

        var exeName = _environment.IsWindows() ? "aspire.exe" : "aspire";
        var targetExePath = Path.Combine(installDir, exeName);
        var tempExtractDir = Directory.CreateTempSubdirectory("aspire-cli-extract").FullName;

        try
        {
            // Extract archive
            await InteractionService.ShowStatusAsync(
                UpdateCommandStrings.ExtractingNewCli,
                async () =>

View on GitHub (pinned to 25830f84bd)