2015-12-02 55 views
3

在我的应用程序中,我需要获取所有加载类型的列表,而不管它们包含哪些程序集。例如,即使项目B中存在该实现,项目A也可能需要获取实现接口A的所有类型的列表。如何使用CoreClr获取加载的程序集中的所有类型?

在.Net框架中,我会通过查询当前应用程序域中的所有程序集来执行此操作。

由于CoreCLR似乎没有应用程序域的概念,因此完成此操作的正确方法是什么?

+0

没有正确的方法,它只能通过删除特征获得*核心*。只对“加载”类型感兴趣是非常奇怪的顺便说一句,藐视合理的猜测替代。 [阅读此](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 –

+0

我不明白“让我所有实现X界面的类型”都很奇怪。我需要向系统请求实现特定接口的所有类型,以便我可以设置缓存映射并能够使用反射来创建实例并在该实例上执行某些操作。这显然是一个有效的用例,因为API存在用于获取程序集的所有类型,但是如果该类在另一个程序集中则无法帮助 – KallDrexx

+1

我也无法看到这是怎么样的XY问题,因为我的问题是我需要获取系统当前已知的所有类型的列表,因为我需要执行一些逻辑来挑选出我感兴趣的类型。 – KallDrexx

回答

0

当RC1-UPDATE1(当在dotnet.exe直接运行注意古怪行为)DNX下运行:

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

对于一个真正的workd例如,见AssemblyLoaderContainerContext.cs在GitHub上我TextMteal项目。

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

相关问题