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
};
}
}
}