private DomainAndModules InitAppDomainData()

in src/Microsoft.Diagnostics.Runtime/ClrRuntime.cs [418:479]


        private DomainAndModules InitAppDomainData()
        {
            Dictionary<ulong, ClrModule> modules = new();
            string bclName = ClrInfo.Flavor == ClrFlavor.Core ? "SYSTEM.PRIVATE.CORELIB" : "MSCORLIB";

            ClrAppDomain? system = null, shared = null;
            ClrModule? bcl = null;

            ImmutableArray<ClrAppDomain>.Builder builder = ImmutableArray.CreateBuilder<ClrAppDomain>();
            foreach (AppDomainInfo domainInfo in GetDacRuntime().EnumerateAppDomains())
            {
                ClrAppDomain domain = new(this, domainInfo, GetService<IAbstractClrNativeHeaps>());

                switch (domainInfo.Kind)
                {
                    case AppDomainKind.Normal:
                        builder.Add(domain);
                        break;

                    case AppDomainKind.System:
                        system = domain;
                        break;

                    case AppDomainKind.Shared:
                        shared = domain;
                        break;

                    default:
                        throw new InvalidDataException($"Unknown domain kind: {domainInfo.Kind}");
                }

                IAbstractModuleHelpers moduleHelpers = GetServiceOrThrow<IAbstractModuleHelpers>();
                IAbstractClrNativeHeaps? nativeHeaps = GetService<IAbstractClrNativeHeaps>();
                ImmutableArray<ClrModule>.Builder moduleBuilder = ImmutableArray.CreateBuilder<ClrModule>();
                foreach (ulong moduleAddress in GetDacRuntime().GetModuleList(domain.Address))
                {
                    if (!modules.TryGetValue(moduleAddress, out ClrModule? module))
                    {
                        module = new(domain, moduleAddress, moduleHelpers, nativeHeaps, DataTarget.DataReader);
                        modules.Add(moduleAddress, module);
                    }

                    moduleBuilder.Add(module);
                    if (bcl is null && module.Name is not null)
                    {
                        try
                        {
                            string fileName = Path.GetFileNameWithoutExtension(module.Name);
                            if (fileName.Equals(bclName, StringComparison.OrdinalIgnoreCase))
                                bcl = module;
                        }
                        catch
                        {
                        }
                    }
                }

                domain.Modules = moduleBuilder.MoveOrCopyToImmutable();
            }

            return new(system, shared, builder.MoveOrCopyToImmutable(), modules.Values.ToArray(), bcl);
        }