dotnet/wpf · error · ArgumentException

SR.TransformStackValid

Error message

SR.TransformStackValid

What it means

DataSpaceManager.DefineDataSpace throws ArgumentException with message SR.TransformStackValid when the transformStack argument is null or empty. A data space must be defined with at least one transform in its stack.

Solutions

  1. Pass at least one valid, previously defined transform label in transformStack.
  2. Guard the call: if (stack == null || stack.Length == 0) define the required transform first via DefineTransform.
  3. Fix configuration so the required transform names are present before data-space definition.

Example fix

// before
manager.DefineDataSpace(new string[0], "MyDataSpace"); // throws
// after
manager.DefineDataSpace(new[] { "Transform.Compression" }, "MyDataSpace");
Defensive patterns

Strategy: validation

Validate before calling

if (transformStack == null || transformStack.Length == 0) throw new ArgumentException("A data space requires at least one transform.");

Type guard

bool HasTransforms(string[] s) => s != null && s.Length > 0;

Try / catch

try { manager.DefineDataSpace(stack, label); } catch (ArgumentException) { /* supply a valid transform stack */ }

Prevention

When it happens

Trigger: Calling DefineDataSpace(null, label) or DefineDataSpace(new string[0], label).

Common situations: Constructing a transform stack programmatically where the list ends up empty because no transforms were configured (e.g. no encryption/integrity transform names loaded from settings).

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14). Data as JSON: /api/errors/77f7e2b15dcf88bc. Report an issue: GitHub.

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/WindowsBase/System/IO/Packaging/CompoundFile/DataSpaceManager.cs:578

            throw new ObjectDisposedException(null, SR.DataSpaceManagerDisposed);
        }
    }

    /// <summary>
    /// Define a data space with the given stack of transform objects and
    /// labeled with the given name.  The transform stack is interpreted in
    /// bottom-up order.  (Clear-text transform is last.)
    /// </summary>
    /// <param name="transformStack">Transform stack</param>
    /// <param name="newDataSpaceLabel">New data space label</param>
    internal void DefineDataSpace( string[] transformStack, string newDataSpaceLabel )
    {
        CheckDisposedStatus();
        // Data space must have at least one transform
        if( null == transformStack ||
            0 == transformStack.Length )
            throw new ArgumentException(
                SR.TransformStackValid);

        // 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" );

View on GitHub (pinned to 81131a70a4)