diff --git a/src/Autofac/Util/Cache/TypeAssemblyReferenceProvider.cs b/src/Autofac/Util/Cache/TypeAssemblyReferenceProvider.cs index 909b9934d..c85e30902 100644 --- a/src/Autofac/Util/Cache/TypeAssemblyReferenceProvider.cs +++ b/src/Autofac/Util/Cache/TypeAssemblyReferenceProvider.cs @@ -39,14 +39,15 @@ public static IEnumerable GetAllReferencedAssemblies(MemberInfo member public static IEnumerable GetAllReferencedAssemblies(MemberInfo memberInfo, HashSet holdingSet) { holdingSet.Clear(); + var activeWorkingSet = new HashSet(); if (memberInfo is Type keyType) { - PopulateAllReferencedAssemblies(keyType, holdingSet); + PopulateAllReferencedAssemblies(keyType, activeWorkingSet, holdingSet); } else if (memberInfo.DeclaringType is Type declaredType) { - PopulateAllReferencedAssemblies(declaredType, holdingSet); + PopulateAllReferencedAssemblies(declaredType, activeWorkingSet, holdingSet); } return holdingSet; @@ -56,31 +57,33 @@ public static IEnumerable GetAllReferencedAssemblies(MemberInfo member /// Add to a provided all assemblies referenced by a given type. /// /// The type to retrieve references for. + /// A set to track types which have been processed. /// A set to add any assemblies to. - private static void PopulateAllReferencedAssemblies(Type inputType, HashSet holdingSet) + private static void PopulateAllReferencedAssemblies(Type inputType, HashSet activeWorkingSet, HashSet holdingSet) { if (inputType.IsArray && inputType.GetElementType() is Type elementType) { - PopulateAllReferencedAssemblies(elementType, holdingSet); + PopulateAllReferencedAssemblies(elementType, activeWorkingSet, holdingSet); } var genericArguments = inputType.GenericTypeArguments; foreach (var genericArgumentType in genericArguments) { - if (holdingSet.Any(a => a.DefinedTypes.Contains(genericArgumentType))) + if (activeWorkingSet.Contains(genericArgumentType)) { continue; } - PopulateAllReferencedAssemblies(genericArgumentType, holdingSet); + PopulateAllReferencedAssemblies(genericArgumentType, activeWorkingSet, holdingSet); } holdingSet.Add(inputType.Assembly); + activeWorkingSet.Add(inputType); if (inputType.BaseType is not null && inputType.BaseType != typeof(object)) { - PopulateAllReferencedAssemblies(inputType.BaseType, holdingSet); + PopulateAllReferencedAssemblies(inputType.BaseType, activeWorkingSet, holdingSet); } } }