Как получить все типы в загруженных сборках с CoreClr?

В моем приложении мне нужно получить список всех загруженных типов независимо от того, в какой сборке они содержатся. Например, Project A может потребоваться получить список всех типов, которые реализуют интерфейс A даже если такая реализация существует в проекте B.

В.Net Framework я бы сделал это, запросив все сборки в текущем домене приложения.

Поскольку в CoreCLR, похоже, отсутствует концепция домена приложения, как правильно это сделать?

1 ответ

При запуске под DNX в RC1-Update1 (обратите внимание на некорректное поведение при запуске непосредственно под dotnet.exe):

var assemblies = PlatformServices.Default.LibraryManager.GetLibraries().SelectMany(l => l.Assemblies.Select(an =>
{
try
{ return Assembly.Load(an); }
catch (ReflectionTypeLoadException)
{ return null; }
})).Where(a => (object)a != null);

Для реального примера работы см. AssemblyLoaderContainerContext.cs в моем проекте TextMteal на GitHub.

Стоит также отметить, что наивная попытка "достать мне все типы, которые реализуют интерфейс X" не приведет к просмотру карт интерфейсов типов. К счастью для Core CLR, TypeInfo предоставляет реализованный интерфейс, который значительно упрощает эту задачу по сравнению с предыдущими полными платформами.NET (до System.Runtime).

Другие вопросы по тегам