Существующий ответ не работал для меня (. NET Core 2.1). Сбой с ошибкой, что System.Runtime не найден. Если я жестко запрограммировал полный путь к System.Runtime, он не работает для других сборок, таких как System.Private.CoreLib. Также проверка типов через IsAssignableFrom, кажется, не работает, когда один тип не из MetadataLoadContext.
Возможным решением для ошибок загрузки сборок является включение всех сборок BCL (все файлы DLL в каталоге, возвращаемые RuntimeEnvironment.GetRuntimeDirectory ). Это выглядит несколько глупо, потому что не все они на самом деле являются управляемыми сборками, но, похоже, это работает. Вот полный пример поиска типов, которые реализуют интерфейс через MetadataLoadContext:
using System;
using System.IO;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.InteropServices;
namespace MetadataLoadContextSample
{
class Program
{
static int Main(string[] args)
{
string inputFile = @"Plugin.dll";
string[] runtimeAssemblies = Directory.GetFiles(RuntimeEnvironment.GetRuntimeDirectory(), "*.dll");
var paths = new List<string>(runtimeAssemblies);
paths.Add(inputFile);
var resolver = new PathAssemblyResolver(paths);
var context = new MetadataLoadContext(resolver);
using (context)
{
Assembly assembly = context.LoadFromAssemblyPath(inputFile);
AssemblyName name = assembly.GetName();
foreach (TypeInfo t in assembly.GetTypes())
{
try
{
if (t.IsClass && t.GetInterface("IPlugin") != null)
{
Console.WriteLine(t.Name);
}
}
catch (FileNotFoundException ex)
{
Console.WriteLine("FileNotFoundException: " + ex.Message);
}
catch (TypeLoadException ex)
{
Console.WriteLine("TypeLoadException: " + ex.Message);
}
}
}
Console.ReadLine();
return 0;
}
}
}