An unhandled exception of type 'System.StackOverflowException' occurred in System.Core.dll

45,343

Solution 1

Without providing code, I guess this is due to a circular dependency. Another possible reason is that you have an improper loop in one of your constructors.

As an example, A class requires an instance of B to be resolved; B class requires an instance of C class to be resolved and C class needs an instance of A to be resolved. This results in an infinite loop:

public class A
{
    public A(B b)
    {
    }
}

public class B
{
    public B(C c)
    {
    }
}

public class C
{
    public C(A a)
    {
    }
}

Solution 2

As Rafael mentioned, this is usually caused by circular dependencies, however if you need these dependencies you can fix it by manually resolving some of them.

For example:

// Register the UnityContainer with itself
container.RegisterInstance<IUnityContainer>(container);

public class A
{
    public A(B b) {}
}

public class B
{
    public B(C c) {}
}

public class C
{
    private readonly IUnityContainer _container;
    private A _a => _container.Resolve<A>();

    public C(IUnityContainer container) {
        _container = container;
    }
}

This means that C can be constructed without needing to know about A until it's time to use it :)

Share:
45,343
Elad Benda
Author by

Elad Benda

linkedin

Updated on July 09, 2022

Comments

  • Elad Benda
    Elad Benda almost 2 years

    In my Asp.net MVC project

    I have a bootsrapper that initialize a unity-container.

    I don't know why, but I get

    An unhandled exception of type 'System.StackOverflowException' occurred in System.Core.dll

    I have doubled checked and registration is done only in my initializer.

    All dependencies are injected in the ctors only.

    What could have caused this?

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
    
            Initializer.Initialize();
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    

    It fails after BundleConfig.RegisterBundles(BundleTable.Bundles);

    public static class Initializer
    {
        private static bool isInitialize;
        private static readonly object LockObj = new object();
        private static IUnityContainer defaultContainer = new UnityContainer();
    
        static Initializer()
        {
            Initialize();
        }
    
        public static void Initialize()
        {
            if (isInitialize)
                return;
    
            lock (LockObj)
            {
                IUnityContainer container = defaultContainer;
    
                //registering Unity for MVC
                DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    
                //registering Unity for web API
                //  GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);
    
                #region managers
                container.RegisterType<ISettingsManager, SettingsManager>();
    
                container.RegisterType<IMamDataManager, MamDataManager>();
    
                container.RegisterType<IAppsDataManager, AppsDataManager>();
                #endregion
    
                #region Dals
                container.RegisterType<IDal<ClientService.DAL.EntityFramework.App>, AppsDal>();
    
                #endregion Dals
    
                #region cache
                container.RegisterType<ICache<string, ClientService.DAL.EntityFramework.Group>, GroupsCache>(new ContainerControlledLifetimeManager());
    
                container.RegisterType<ICache<string, ClientService.DAL.EntityFramework.App>, AppsCache>(new ContainerControlledLifetimeManager());
    
                container.RegisterType<ICache<string, SettingsServiceData>, SettingsServiceDataCache>(new ContainerControlledLifetimeManager());
                #endregion cache
    
                #region Pollers
                container.RegisterType<IPoller<ClientService.DAL.EntityFramework.Group>, GroupsPoller>(new ContainerControlledLifetimeManager());
    
                container.RegisterType<IPoller<ClientService.DAL.EntityFramework.App>, AppsPoller>(new ContainerControlledLifetimeManager());
    
                container.RegisterType<IPoller<SettingsServiceData>, SettingsPoller>(new ContainerControlledLifetimeManager());
    
    
    
                #endregion Pollers
    
    
                container.RegisterType<IDefaultConfigurationGroupSingleton, DefaultConfigurationGroupSingleton>(new ContainerControlledLifetimeManager());
    
                container.RegisterType<IApplicationLogger, Log4NetLogger>();
    
                if (!isInitialize)
                {
                    isInitialize = true;
                }
            }
        }
    }
    
  • Elad Benda
    Elad Benda over 11 years
    how can I fix this? I f I want to inject all in DI?
  • daryal
    daryal over 11 years
    you can not fix without changing the code structure. You need to fix the circular dependencies. For example, removing the A from Constructor of C resolves the circular dependency problem.
  • saurabhj
    saurabhj over 6 years
    Yes. I by mistake added a dep injection into the same service class and this started happening. Removed the link and issue solved! I wish it gave better error messages - this drove me crazy!