microsoft/aspire · error · ProjectUpdaterException

Could not find <Sdk Name='Aspire.AppHost.Sdk' /> element in

Error message

Could not find <Sdk Name='Aspire.AppHost.Sdk' /> element in {projectFile.FullName}

What it means

For an old-format AppHost csproj (no Sdk attribute on <Project>), the updater looks for <Sdk Name='Aspire.AppHost.Sdk' /> to migrate to the new <Project Sdk="Aspire.AppHost.Sdk/version"> format. If the Sdk element is absent, it cannot perform the migration and throws ProjectUpdaterException.

Solutions

  1. Add <Sdk Name="Aspire.AppHost.Sdk" Version="x.y.z" /> as a child of <Project> (old format) or move to <Project Sdk="Aspire.AppHost.Sdk/x.y.z"> (new format), then re-run update.
  2. Check for typos/casing in the Sdk element's Name attribute — it must be exactly 'Aspire.AppHost.Sdk'.
  3. Restore the original csproj from source control if the SDK declaration was accidentally deleted.

Example fix

// before
<Project>
  <!-- no Sdk element -->
</Project>
// after
<Project Sdk="Aspire.AppHost.Sdk/9.4.0" />
Defensive patterns

Strategy: validation

Validate before calling

var doc = new XmlDocument();
doc.Load(appHostCsproj);
var hasSdkAttr = doc.DocumentElement?.Attributes["Sdk"] is not null;
var hasSdkEl = doc.SelectSingleNode("//Sdk[@Name='Aspire.AppHost.Sdk']") is not null;
if (!hasSdkAttr && !hasSdkEl)
    throw new InvalidOperationException($"{appHostCsproj} does not declare Aspire.AppHost.Sdk in either supported format.");

Try / catch

try { await updater.UpdateAsync(...); }
catch (ProjectUpdaterException ex) when (ex.Message.Contains("Could not find <Sdk Name='Aspire.AppHost.Sdk'"))
{
    // add the Sdk declaration manually, then re-run update
}

Prevention

When it happens

Trigger: UpdateSdkVersionInProjectAppHostAsync encountering a csproj with no Sdk attribute on <Project> AND no <Sdk Name="Aspire.AppHost.Sdk" .../> child element — the file references the Aspire AppHost SDK in neither recognized format.

Common situations: An AppHost csproj where the SDK is declared through imported props/targets instead of a direct Sdk element; a file that lost its <Sdk> line in a merge; a hand-edited csproj with a misspelled SDK name (e.g. Name="Aspire.Apphost.Sdk").

Understand the failure class

Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.

Related errors


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

Appendix: source

Thrown at src/Aspire.Cli/Projects/ProjectUpdater.cs:720

            throw new ProjectUpdaterException(string.Format(CultureInfo.InvariantCulture, UpdateCommandStrings.CouldNotFindRootProjectElementFormat, projectFile.FullName));
        }

        // Check if the SDK is set via the Sdk attribute on the Project element (new format)
        var sdkAttribute = projectNode.Attributes?["Sdk"];
        if (sdkAttribute is not null && ContainsAspireAppHostSdk(sdkAttribute.Value))
        {
            // Already using new format: <Project Sdk="Aspire.AppHost.Sdk/version">
            // Update the version, preserving any other SDKs in the attribute
            sdkAttribute.Value = UpdateAspireAppHostSdkVersion(sdkAttribute.Value, package.Version);
        }
        else
        {
            // Migrate from old format to new format
            // Old format: <Sdk Name="Aspire.AppHost.Sdk" Version="..." />
            var sdkNode = projectNode.SelectSingleNode("Sdk[@Name='Aspire.AppHost.Sdk']");
            if (sdkNode is null)
            {
                throw new ProjectUpdaterException(string.Format(CultureInfo.InvariantCulture, UpdateCommandStrings.CouldNotFindSdkElementFormat, projectFile.FullName));
            }

            // Set the new format: <Project Sdk="Aspire.AppHost.Sdk/version">
            // The Aspire.AppHost.Sdk already includes the base .NET SDK, so we replace any existing SDK attribute
            if (sdkAttribute is not null)
            {
                sdkAttribute.Value = $"{AspireAppHostSdkName}/{package.Version}";
            }
            else
            {
                var newSdkAttribute = projectDocument.CreateAttribute("Sdk");
                newSdkAttribute.Value = $"{AspireAppHostSdkName}/{package.Version}";
                projectNode.Attributes!.SetNamedItem(newSdkAttribute);
            }

            // Remove the old <Sdk Name="Aspire.AppHost.Sdk" /> element and any surrounding whitespace
            RemoveNodeWithWhitespace(sdkNode);
        }

View on GitHub (pinned to 25830f84bd)