dotnet/wpf · error · ArgumentException
Data space transform stack includes undefined transform…
Error message
Data space transform stack includes undefined transform labels.
What it means
DataSpaceManager.DefineDataSpace validates that every transform label in the given transform stack has already been registered via DefineTransform. If any label in the stack is not a defined transform label, an ArgumentException with SR.TransformLabelUndefined is thrown and the data space is not created. This is a fail-fast guard so a data space never references a transform that has no registered TransformEnvironment/instance.
Solutions
- Register every transform first: call DefineTransform for each label before passing the stack to DefineDataSpace.
- Verify each label string matches exactly the label used in DefineTransform (watch for typos, trailing whitespace, null/empty entries).
- Reorder your code so transform registration happens before data space definition.
- Catch ArgumentException with message SR.TransformLabelUndefined and log which stack element is undefined before retrying with corrected labels.
Example fix
// before
manager.DefineDataSpace(new[] { "EncodedTransform" }, "MyDataSpace");
// after
if (!manager.TransformLabelIsDefined("EncodedTransform"))
manager.DefineTransform("EncodedTransform", transformFactory);
manager.DefineDataSpace(new[] { "EncodedTransform" }, "MyDataSpace"); Defensive patterns
Strategy: validation
Validate before calling
string[] stack = GetTransformStack();
if (stack == null || stack.Any(l => string.IsNullOrEmpty(l) || !manager.TransformLabelIsDefined(l)))
throw new InvalidOperationException("All transform labels must be defined via DefineTransform before DefineDataSpace."); Prevention
- Always register transforms with DefineTransform before defining data spaces.
- Centralize transform label constants instead of scattering string literals.
- Add an assertion helper that validates the whole stack before calling DefineDataSpace.
When it happens
Trigger: Calling DefineDataSpace(string[] transformStack, string newDataSpaceLabel) (or the auto-named overload, which delegates to it) with an entry in transformStack that was never passed to DefineTransform, is misspelled, differs in casing beyond the comparison rules, is null, or is an empty string. Also thrown via SR.TransformLabelUndefined when a label was defined but its transform object was subsequently found unresolvable.
Common situations: Typo or casing mismatch between the label used in DefineTransform and in DefineDataSpace; defining the data space before registering its transforms; copying sample code that references transform labels from a different package; building the stack array dynamically and inserting a null/empty element.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- SR.FileModeInvalid
- SR.FileModeUnsupported
- Transform label name is already in use.
- ' ' ID is not a valid XSD ID.
- Cannot compare different types.
AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14).
Data as JSON: /api/errors/6112b17063626c06.
Report an issue: GitHub.
Appendix: source
Thrown at src/Microsoft.DotNet.Wpf/src/WindowsBase/System/IO/Packaging/CompoundFile/DataSpaceManager.cs:598
// Given label must be a non-empty string
CU.CheckStringAgainstNullAndEmpty(newDataSpaceLabel, "newDataSpaceLabel");
// Given label must not be a reserved string
CU.CheckStringAgainstReservedName(newDataSpaceLabel, "newDataSpaceLabel");
// Given label must not already be in use
if( DataSpaceIsDefined( newDataSpaceLabel ) )
throw new ArgumentException(
SR.DataSpaceLabelInUse);
// Given transform array must include labels that have already been defined
foreach( string transformLabel in transformStack )
{
CU.CheckStringAgainstNullAndEmpty( transformLabel, "Transform label" );
if( !TransformLabelIsDefined( transformLabel ) )
throw new ArgumentException(
SR.TransformLabelUndefined);
}
// Passes all inspection, data space definition successful.
SetDataSpaceDefinition( newDataSpaceLabel, new DataSpaceDefinition(new ArrayList(transformStack), null));
_dirtyFlag = true;
return;
}
/// <summary>
/// Internal shortcut to check if data space is defined. When we start
/// doing on-demand reads of data space definitions, the "demand" could
/// be triggered by this.
/// </summary>
/// <param name="dataSpaceLabel">Label to check</param>
/// <returns>True if label is in use</returns>
internal bool DataSpaceIsDefined( string dataSpaceLabel )View on GitHub (pinned to 81131a70a4)