private IEnumerable GetDependencies()

in src/lib/Microsoft.Fx.Portability.Cci/Analyzer/DependencyFinderEngine.cs [83:178]


        private IEnumerable<MemberDependency> GetDependencies(string assemblyLocation)
        {
            using (var host = new HostEnvironment())
            {
                host.UnableToResolve += (s, e) =>
                {
                    string callingAssembly = e.Referrer.FullName();

                    // Try to get better information about the referrer. This may throw, but we don't want to crash even if we do.
                    try
                    {
                        callingAssembly = e.Referrer.GetAssemblyReference().AssemblyIdentity.Format();
                    }
                    catch
                    {
                    }

                    var newValue = new HashSet<string> { callingAssembly };

                    _unresolvedAssemblies.AddOrUpdate(e.Unresolved.Format(), newValue, (key, existingHashSet) =>
                    {
                        lock (existingHashSet)
                        {
                            existingHashSet.Add(callingAssembly);
                        }

                        return existingHashSet;
                    });
                };

                host.UnifyToLibPath = true;
                var cciAssembly = host.LoadAssembly(assemblyLocation);

                if (cciAssembly == null)
                {
                    _assembliesWithError.Add(assemblyLocation);
                    yield break;
                }

                // Extract the fileversion and assembly version from the assembly.
                var fileInfo = FileVersionInfo.GetVersionInfo(assemblyLocation);

                var assemblyInfo = new AssemblyInfo
                {
                    Location = cciAssembly.Location,
                    AssemblyIdentity = cciAssembly.AssemblyIdentity.Format(),
                    FileVersion = fileInfo.FileVersion ?? string.Empty,
                    TargetFrameworkMoniker = cciAssembly.GetTargetFrameworkMoniker()
                };

                // remember this assembly as a user assembly.
                _userAssemblies.Add(assemblyInfo);

                // Identify references to members (generic and non-generic)
                foreach (var reference in cciAssembly.GetTypeMemberReferences())
                {
                    if (reference.ContainingType.GetAssemblyReference() == null)
                    {
                        continue;
                    }

                    string definedIn = reference.ContainingType.GetAssemblyReference().ContainingAssembly.AssemblyIdentity.Format();

                    // return the type
                    yield return new MemberDependency()
                    {
                        CallingAssembly = assemblyInfo,
                        MemberDocId = reference.ContainingType.DocId(),
                        DefinedInAssemblyIdentity = definedIn
                    };

                    // return the member
                    yield return new MemberDependency()
                    {
                        CallingAssembly = assemblyInfo,
                        MemberDocId = reference.DocId(),
                        TypeDocId = reference.ContainingType.DocId(),
                        DefinedInAssemblyIdentity = definedIn
                    };
                }

                // Identify references to types
                foreach (var refence in cciAssembly.GetTypeReferences())
                {
                    string definedIn = refence.GetAssemblyReference().ContainingAssembly.AssemblyIdentity.Format();

                    // return the type
                    yield return new MemberDependency()
                    {
                        CallingAssembly = assemblyInfo,
                        MemberDocId = refence.DocId(),
                        DefinedInAssemblyIdentity = definedIn
                    };
                }
            }
        }