Unity-Technologies/UnityCsReference · error · Exception

Cannot start AssemblyBuilder with status {0}. Expected {1}

Error message

Cannot start AssemblyBuilder with status {0}. Expected {1}

What it means

Thrown by AssemblyBuilder.Build when status is not AssemblyBuilderStatus.NotStarted. A builder can only be started once; calling Build on an already-started/compiling/finished builder is rejected.

Source

Thrown at Editor/Mono/Scripting/ScriptCompilation/AssemblyBuilder.cs:100

            buildTargetGroup = EditorUserBuildSettings.activeBuildTargetGroup;
            buildTarget = EditorUserBuildSettings.activeBuildTarget;
        }

        public bool Build()
        {
            return Build(EditorCompilationInterface.Instance);
        }

        internal bool Build(EditorCompilation editorCompilation)
        {
            if (editorCompilation.IsCompilationTaskCompiling()
                || editorCompilation.IsAnyAssemblyBuilderCompiling())
            {
                return false;
            }

            if (status != AssemblyBuilderStatus.NotStarted)
                throw new Exception(string.Format("Cannot start AssemblyBuilder with status {0}. Expected {1}", status, AssemblyBuilderStatus.NotStarted));

            var assembly = editorCompilation.CreateScriptAssembly(this);
#pragma warning disable UA2001 // The Banned API Analyzer produces compile errors for any new Linq code. This pre-existing usage has been suppressed, but should be rewritten if possible.
            var assemblies = assembly.AllRecursiveScripAssemblyReferencesIncludingSelf().ToArray();
#pragma warning restore UA2001

            // Start clean everytime
            const string beeAssemblyBuilderDirectory = "Library/BeeAssemblyBuilder";
            string beeAssemblyBuilderDirectoryInProjectDirectory =
                string.IsNullOrEmpty(editorCompilation.projectDirectory)
                ? beeAssemblyBuilderDirectory
                : Path.Combine(editorCompilation.projectDirectory, beeAssemblyBuilderDirectory);

            if (Directory.Exists(beeAssemblyBuilderDirectoryInProjectDirectory))
                Directory.Delete(beeAssemblyBuilderDirectoryInProjectDirectory, true);

            var debug = compilerOptions.CodeOptimization == CodeOptimization.Debug;

View on GitHub (pinned to 225b0fbdb5)

Solutions

  1. Create a fresh AssemblyBuilder instance for each build.
  2. Check builder.status == AssemblyBuilderStatus.NotStarted before calling Build.

Example fix

// before
builder.Build();
builder.Build(); // throws
// after
if (builder.status != AssemblyBuilderStatus.NotStarted) builder = new AssemblyBuilder(path, scripts);
builder.Build();
Defensive patterns

Strategy: validation

Validate before calling

if (builder.status != AssemblyBuilderStatus.NotStarted)
    builder = new AssemblyBuilder(assemblyPath, scripts); // fresh instance
builder.Build();

Type guard

static bool CanStart(AssemblyBuilder b) =>
    b.status == AssemblyBuilderStatus.NotStarted;

Try / catch

try { builder.Build(); }
catch (Exception ex) when (ex.Message.Contains("Cannot start AssemblyBuilder"))
{ /* create a new builder instance and rebuild */ }

Prevention

When it happens

Trigger: Calling Build() on an AssemblyBuilder whose status has advanced past NotStarted (e.g. calling Build twice on the same instance).

Common situations: Reusing a single AssemblyBuilder instance for multiple builds, or calling Build after a previous attempt already moved the status.

Related errors


AI-assisted analysis of Unity-Technologies/UnityCsReference@225b0fbdb5 (2026-08-13). Data as JSON: /api/errors/af1b0fef4a809b24. Report an issue: GitHub.