public AssemblyDefinition ResolveAssembly(IAssemblyDescriptor descriptor)
{
AssemblyDefinition definition;
if (_cachedAssemblies.TryGetValue(descriptor, out definition))
return definition;
var path = GetFilePath(descriptor);
if (!string.IsNullOrEmpty(path))
{
var assembly = ReadAssembly(path);
if (assembly.NetDirectory != null && assembly.NetDirectory.MetadataHeader != null)
{
var tableStream = assembly.NetDirectory.MetadataHeader.GetStream<TableStream>();
if (tableStream != null)
{
var assemblyTable = tableStream.GetTable<AssemblyDefinition>();
if (assemblyTable.Count > 0)
{
definition = assemblyTable[0];
_cachedAssemblies.Add(descriptor, definition);
return definition;
}
}
}
}
definition = OnAssemblyResolutionFailed(new AssemblyResolutionEventArgs(descriptor));
if (definition == null)
{
if (ThrowOnNotFound)
throw new AssemblyResolutionException(descriptor);
}
else
{
_cachedAssemblies.Add(descriptor, definition);
}
return definition;
}