private void HandleAddingPreCompiledPluginInDirectory(AggregateCatalog returnValue, string pluginDirectory)
{
List<Assembly> assemblies = new List<Assembly>();
var assembliesFiles = Directory.GetFiles(pluginDirectory, "*.dll");
foreach (string assemblyName in assembliesFiles)
{
try
{
if (IsAssemblyAlreadyReferenced(assemblyName))
{
string message = $"Warning: {pluginDirectory} - Skipping over assembly {assemblyName} because it is already loaded by a different plugin";
CompileOutput.Add(message);
}
else
{
var asm = Assembly.LoadFrom(assemblyName);
assemblies.Add(asm);
}
}
catch (Exception ex)
{
CompileErrors.Add(string.Format("Failed to load {0}: {1}", assemblyName, ex.Message));
}
}
AggregateCatalog catalogToMakeSureStuffIsLinked = new AggregateCatalog();
foreach (var assembly in assemblies)
{
var catalog = new AssemblyCatalog(assembly);
catalogToMakeSureStuffIsLinked.Catalogs.Add(catalog);
}
bool failed = false;
try
{
var container = new CompositionContainer(catalogToMakeSureStuffIsLinked);
container.GetExports<object>();
}
catch (Exception e)
{
string message = "";
message += "Error trying to load plugins from directory: " + pluginDirectory;
if (e is ReflectionTypeLoadException)
{
foreach (var innerException in (e as ReflectionTypeLoadException).LoaderExceptions)
{
message += "\r\n" + innerException.ToString();
}
}
else
{
message += "\r\n" + e.ToString();
}
CompileErrors.Add(message);
failed = true;
}
if (!failed)
{
foreach (var assemblyCatalog in catalogToMakeSureStuffIsLinked.Catalogs)
{
returnValue.Catalogs.Add(assemblyCatalog);
}
}
}