stride3d/stride · error · ArgumentNullException
ArgumentNullException: dependencyManager
Error message
ArgumentNullException: dependencyManager
What it means
FixAssetReferencesViewModel's constructor requires an IAssetDependencyManager and throws ArgumentNullException when it is null; the manager is stored and used to find assets referencing deleted objects.
Solutions
- Pass the active IAssetDependencyManager instance from the editor's session
- Resolve the dependency manager via IServiceProvider before constructing
- Register the dependency analysis service if it is missing
Example fix
// before new FixAssetReferencesViewModel(serviceProvider, deleted, dependencyManager, dialog); // after dependencyManager ??= serviceProvider.Get<IAssetDependencyManager>(); new FixAssetReferencesViewModel(serviceProvider, deleted, dependencyManager, dialog);
Defensive patterns
Strategy: validation
Validate before calling
dependencyManager ??= serviceProvider.Get<IAssetDependencyManager>();
if (dependencyManager == null) throw new InvalidOperationException("IAssetDependencyManager not registered");
var vm = new FixAssetReferencesViewModel(sp, deletedObjects, dependencyManager, dialog); Type guard
static bool HasDependencyManager([NotNullWhen(true)] IAssetDependencyManager? m) => m is not null;
Try / catch
try { vm = new FixAssetReferencesViewModel(sp, deleted, mgr, dialog); } catch (ArgumentNullException ex) { logger.LogError(ex, "Dependency manager missing"); throw; } Prevention
- Register required services with the IViewModelServiceProvider before use
- Resolve dependencies explicitly before constructing view models
- Validate all [NotNull] constructor parameters in DI factories
When it happens
Trigger: Constructing FixAssetReferencesViewModel(serviceProvider, deletedObjects, dependencyManager, dialog) with dependencyManager == null.
Common situations: The asset dependency service was not registered in the service provider / not resolved before opening the Fix Asset References view.
Related errors
- entity must contain a non-null asset entity.
- ArgumentNullException: templates
- ArgumentNullException: deletedObjects
- ArgumentNullException: nodeContainer
- ArgumentNullException: removeAction
AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14).
Data as JSON: /api/errors/42fda3a6605e6335.
Report an issue: GitHub.
Appendix: source
Thrown at sources/editor/Stride.Core.Assets.Editor/Components/FixAssetReferences/FixAssetReferencesViewModel.cs:28
using Stride.Core.Assets.Editor.ViewModel;
using Stride.Core.Assets.Quantum;
using Stride.Core.Annotations;
using Stride.Core.Extensions;
using Stride.Core.Presentation.Services;
using Stride.Core.Quantum;
using Stride.Core.Presentation.ViewModels;
namespace Stride.Core.Assets.Editor.Components.FixAssetReferences
{
public class FixAssetReferencesViewModel : FixReferencesViewModel<AssetViewModel>
{
private readonly IAssetDependencyManager dependencyManager;
private readonly HashSet<AssetId> hashIds;
public FixAssetReferencesViewModel([NotNull] IViewModelServiceProvider serviceProvider, [ItemNotNull, NotNull] IEnumerable<AssetViewModel> deletedObjects, [NotNull] IAssetDependencyManager dependencyManager, [NotNull] IFixReferencesDialog dialog)
: base(serviceProvider, dialog)
{
if (dependencyManager == null) throw new ArgumentNullException(nameof(dependencyManager));
this.dependencyManager = dependencyManager;
hashIds = new HashSet<AssetId>();
hashIds.AddRange(deletedObjects.Select(x => x.Id));
}
protected override IEnumerable<KeyValuePair<object, List<AssetViewModel>>> FindReferencers(AssetViewModel deletedObject)
{
var session = deletedObject.Session;
var dependencies = dependencyManager.ComputeDependencies(deletedObject.AssetItem.Id, AssetDependencySearchOptions.In, ContentLinkType.Reference);
var referencers = dependencies?.LinksIn.Select(x => session.GetAssetById(x.Item.Id)).NotNull().Where(x => !hashIds.Contains(x.Id)).ToList() ?? new List<AssetViewModel>();
yield return new KeyValuePair<object, List<AssetViewModel>>(deletedObject, referencers);
}
protected override IEnumerable<ReferenceReplacementViewModel<AssetViewModel>> GetReplacementsForReferencer(AssetViewModel referencer, object referencedMember)
{
var rootNode = SessionViewModel.Instance.AssetNodeContainer.GetNode(referencer.Asset);
var visitor = new GraphVisitorBase { SkipRootNode = true };
var result = new List<ReferenceReplacementViewModel<AssetViewModel>>();View on GitHub (pinned to 96fad776d2)