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
- Create a fresh AssemblyBuilder instance for each build.
- 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
- Treat an AssemblyBuilder as single-use; make a new one per build.
- Check status before calling Build to fail fast.
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
- assemblyPath cannot be null or empty
- scriptPaths cannot be null or empty
- Invalid argument {0} provided.
- {reference} is not a GUID reference
- Required property 'name' not set
AI-assisted analysis of Unity-Technologies/UnityCsReference@225b0fbdb5 (2026-08-13).
Data as JSON: /api/errors/af1b0fef4a809b24.
Report an issue: GitHub.