搜索程序集中的类型

xwr*_*wrs 5 .net c# reflection appdomain

我有一个代码Type.GetType(myTypeName)正在返回的问题,null因为具有该类型的程序集不是当前正在执行的程序集.

我发现这个问题的解决方案是下一个:

var assemblies = AppDomain.CurrentDomain.GetAssemblies();
Type myType = assemblies.SelectMany(a => a.GetTypes())
                        .Single(t => t.FullName == myTypeName);
Run Code Online (Sandbox Code Playgroud)

问题是第一次运行此代码会导致异常"Sequence contains no matching element".当我再次调用此部分代码时 - 一切正常并且需要加载类型.

谁能解释这种行为?为什么在第一次调用的范围内没有找到需要的汇编/类型?

And*_*iuk 4

您面临的问题是由类的GetAssemblies方法的设计引起的AppDomain- 根据文档该方法:

获取已加载到此应用程序域的执行上下文中的程序集。

因此,当您的程序类型第一次未能找到时,应用程序显然尚未加载其程序集。之后 - 当使用包含相关类型的程序集中的某些功能时 - 程序集已加载,并且相同的代码已经可以找到丢失的类型。

请尝试直接加载程序集。而不是使用:

var assemblies = AppDomain.CurrentDomain.GetAssemblies();
Run Code Online (Sandbox Code Playgroud)

您可以使用:

List<Assembly> assemblies = Assembly.GetEntryAssembly().GetReferencedAssemblies().Select(assembly => Assembly.LoadFrom(assembly.Name)).ToList();
Run Code Online (Sandbox Code Playgroud)