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

本文关键字:集中 类型 程序集 程序 CoreClr 何使用 获取 加载 | 更新日期: 2023-09-27 18:25:26

在我的应用程序中,无论它们包含在哪个程序集中,我都需要获得加载的所有类型的列表。例如,项目a可能需要获得实现接口A的所有类型列表,即使该实现存在于项目B中。

在中。Net Framework我会通过查询当前应用程序域中的所有程序集来实现这一点。

既然CoreCLR中似乎没有应用程序域的概念,那么实现这一点的正确方法是什么?

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

当在RC1-Update1中的DNX下运行时(请注意,当直接在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);

关于一个实际的工作示例,请参阅我在GitHub上的TextMteal项目中的AssemblyLoaderContainerContext.cs。

同样值得注意的是,"给我所有实现X接口的类型"的天真尝试将无法查看类型的接口映射。幸运的是,对于Core CLR来说,TypeInfo公开了ImplementedInterfaces,与以前的版本相比,它大大简化了此任务。NET完整框架(System.Runtime之前)。