private static void InitializeAssemblies(IEnumerable<Assembly> assemblies, bool force)
{
lock (_lockObject)
{
var assembliesToRetrieve = new List<Assembly>();
foreach (var assembly in assemblies)
{
var loadedAssemblyFullName = assembly.FullName;
var containsLoadedAssembly = _loadedAssemblies.Contains(loadedAssemblyFullName);
if (!force && containsLoadedAssembly)
{
continue;
}
if (!containsLoadedAssembly)
{
_loadedAssemblies.Add(loadedAssemblyFullName);
}
if (ShouldIgnoreAssembly(assembly))
{
continue;
}
assembliesToRetrieve.Add(assembly);
}
var typesToAdd = GetAssemblyTypes(assembliesToRetrieve);
foreach (var assemblyWithTypes in typesToAdd)
{
foreach (var type in assemblyWithTypes.Value)
{
InitializeType(assemblyWithTypes.Key, type);
}
}
#if NET
var lateLoadedAssemblies = new List<Assembly>();
lock (_threadSafeAssemblyQueue)
{
while (_threadSafeAssemblyQueue.Count > 0)
{
var assembly = _threadSafeAssemblyQueue.Dequeue();
lateLoadedAssemblies.Add(assembly);
}
}
if (lateLoadedAssemblies.Count > 0)
{
InitializeAssemblies(lateLoadedAssemblies, false);
}
#endif
}
}