dotnet/wpf · error · InvalidOperationException

SR.MissingNameResolver

Error message

SR.MissingNameResolver

What it means

ReferenceExtension.ProvideValue throws InvalidOperationException (SR.MissingNameResolver) when the serviceProvider does not return an IXamlNameResolver for typeof(IXamlNameResolver). The {x:Reference} markup extension resolves names at parse time and is meaningless without that service. It also null-guards the serviceProvider itself with ArgumentNullException.

Solutions

  1. Invoke ProvideValue within a XAML load pipeline that supplies IXamlNameResolver (XamlXmlLoader / WPF parser).
  2. For custom hosts, register an IXamlNameResolver implementation in the service provider passed to ProvideValue.
  3. Never pass null serviceProvider; construct a provider exposing at least IXamlNameResolver.

Example fix

// before
new ReferenceExtension("btnOk").ProvideValue(new EmptyServiceProvider()); // throws
// after
var provider = new ServiceProviderBuilder().AddXamlNameResolver(nameScope).Build();
var value = new ReferenceExtension("btnOk").ProvideValue(provider);
Defensive patterns

Strategy: type-guard

Validate before calling

if (serviceProvider is null) throw new ArgumentNullException(nameof(serviceProvider));
if (serviceProvider.GetService(typeof(IXamlNameResolver)) is not IXamlNameResolver) throw new InvalidOperationException("IXamlNameResolver missing from provider");

Type guard

bool CanResolveReference(IServiceProvider sp) => sp?.GetService(typeof(IXamlNameResolver)) is IXamlNameResolver;

Try / catch

try { var v = referenceExt.ProvideValue(provider); }
catch (InvalidOperationException ex) when (ex.Message == SR.MissingNameResolver) { /* evaluate outside XAML — resolve by other means */ }

Prevention

When it happens

Trigger: Calling ProvideValue with a null serviceProvider (ArgumentNullException), or with a service provider that lacks IXamlNameResolver — e.g. outside XAML parsing, in design-time tooling, or with a custom provider missing the service.

Common situations: Evaluating markup extensions programmatically with a minimal IServiceProvider; XAML processed outside the normal loader (preview/render tools); tests instantiating ReferenceExtension and calling ProvideValue with stub providers.

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


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

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Windows/Markup/Reference.cs:30

    {
        public Reference()
        {
        }

        public Reference(string name)
        {
            Name = name;
        }

        [ConstructorArgument("name")]
        public string Name { get; set; }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            ArgumentNullException.ThrowIfNull(serviceProvider);
            if (serviceProvider.GetService(typeof(IXamlNameResolver)) is not IXamlNameResolver nameResolver)
            {
                throw new InvalidOperationException(SR.MissingNameResolver);
            }

            if (string.IsNullOrEmpty(Name))
            {
                throw new InvalidOperationException(SR.MustHaveName);
            }

            object obj = nameResolver.Resolve(Name);
            if (obj is null)
            {
                string[] names = new string[] { Name };
                obj = nameResolver.GetFixupToken(names, true);
            }

            return obj;
        }
    }
}

View on GitHub (pinned to 81131a70a4)