如何使用CoreClr获取加载的程序集中的所有类型?

时间:2015-12-02 18:23:46

标签: c# coreclr

在我的应用程序中,我需要获取所有类型的列表,无论它们包含在哪个程序集中。例如,项目A可能需要获取实现接口A的所有类型的列表,即使这样项目B中存在实施。

在.Net Framework中,我会通过查询当前应用程序域中的所有程序集来完成此任务。

由于看似应用领域的概念在CoreCLR中消失了,实现这一目标的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

在RC1-Update1中在DNX下运行时(注意直接在dotnet.exe下运行时的flakey行为):

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);

有关实际工作示例,请参阅GitHub上TextMteal项目中的AssemblyLoaderContainerContext.cs

值得注意的是,“让我获得实现X接口的所有类型”的天真尝试将无法查看类型的接口映射。幸运的是,对于Core CLR,TypeInfo公开了ImplementedInterfaces,与previos .NET完整框架(在System.Runtime之前)相比,它大大简化了这项任务。