Unity-Technologies/UnityCsReference · error · ArgumentException

target must be valid

Error message

target must be valid

What it means

Thrown by GetTargetStringFrom(BuildTarget) when the BuildTarget equals BuildTarget.NoTarget. NoTarget is the sentinel for an unset/invalid target and cannot be mapped to a module name.

Source

Thrown at Editor/Mono/Modules/ModuleManager.cs:576

            derivedBuildTargetProvider.RemoveDerivedBuildTargetExtension(platformGuid);
            platformSupportModulesByGuid.Remove(platformGuid);
        }

        internal static string GetTargetStringFromBuildTarget(BuildTarget target)
        {
            return BuildTargetDiscovery.GetModuleNameForBuildTarget(target);
        }

        internal static string GetTargetStringFromBuildTargetGroup(BuildTargetGroup target)
        {
            return BuildTargetDiscovery.GetModuleNameForBuildTargetGroup(target);
        }

        // This function returns module name depending on the combination of targetGroup x target
        internal static string GetTargetStringFrom(BuildTarget target)
        {
            if (target == BuildTarget.NoTarget)
                throw new ArgumentException("target must be valid");

            return GetTargetStringFromBuildTarget(target);
        }

        [Obsolete("ModuleManager.GetTargetStringFrom(BuildTargetGroup targetGroup, BuildTarget target) is deprecated, please use ModuleManager.GetTargetStringFrom(BuildTarget target)")]
        internal static string GetTargetStringFrom(BuildTargetGroup targetGroup, BuildTarget target)
        {
            return GetTargetStringFrom(target);
        }

        internal static bool IsPlatformSupported(BuildTarget target)
        {
            return GetTargetStringFromBuildTarget(target) != null;
        }

        internal static string GetExtensionVersion(string target)
        {
            if (string.IsNullOrEmpty(target))

View on GitHub (pinned to 225b0fbdb5)

Solutions

  1. Ensure the BuildTarget passed in is a concrete platform (e.g., StandaloneWindows64, Android).
  2. Validate the target at the call site: reject NoTarget before invoking GetTargetStringFrom.
  3. Initialize BuildTarget fields explicitly rather than relying on enum default.

Example fix

// before
string t = ModuleManager.GetTargetStringFrom(activeTarget); // activeTarget may be NoTarget
// after
if (activeTarget == BuildTarget.NoTarget)
    throw new InvalidOperationException("Select a build target first.");
string t = ModuleManager.GetTargetStringFrom(activeTarget);
Defensive patterns

Strategy: validation

Validate before calling

if (target != BuildTarget.NoTarget)
    string s = ModuleManager.GetTargetStringFrom(target);

Type guard

static bool IsValidBuildTarget(BuildTarget t) => t != BuildTarget.NoTarget;

Prevention

When it happens

Trigger: Passing BuildTarget.NoTarget (value 0) into ModuleManager.GetTargetStringFrom(BuildTarget). Often happens when a BuildTarget variable was never assigned or defaulted.

Common situations: Build pipeline invoked before a target was selected. BuildTarget parsed from an unset editor preference or a deserialized enum defaulting to 0 (NoTarget).

Related errors


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