C#反思:在解决方案中获取* all * active程序集?

inheritance人我的问题:

我有两个项目 – 一个’常见’项目,其行为类似于具有各种支持代码的库,以及在许多调用中使用该项目的实际程序。 我们将这些项目称为“共同”和“程序”。 它们都在同一个解决方案中。

在“Common”中,我有一个用于commoreflection任务的类,比如创建一个实例。 如果我调用GetExecutingAssembly,它将获得所有“公共”类型,但是当我使用GetEntryAssembly时,我得到“程序”类型。

虽然我当然可以编辑代码以使用2套asm,但我担心解决方案中不仅仅有2个项目的情况 – 比方说5(不知道为什么,但让我们去那里现在),我担心调用GetExecutingAssembly和GetEntryAssembly不会获得整个程序中的所有类型。

还有其他方法可以让所有类型都在解决方案中吗?

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); 

这将获取当前AppDomain中的所有已加载程序集。

如评论中所述,可以生成多个AppDomain,在这种情况下,每个AppDomain都可以拥有自己的程序集。 这样做的直接好处是您可以通过卸载包含的AppDomain来卸载程序集。

这是一个非常古老的问题,但为了将来参考,这是一个完整的实现:

  public static IEnumerable GetAssemblies() { var list = new List(); var stack = new Stack(); stack.Push(Assembly.GetEntryAssembly()); do { var asm = stack.Pop(); yield return asm; foreach (var reference in asm.GetReferencedAssemblies()) if (!list.Contains(reference.FullName)) { stack.Push(Assembly.Load(reference)); list.Add(reference.FullName); } } while (stack.Count > 0); } 

如何使用GetReferencedAssemblies来处理AssemblyRef元数据条目? “解决方案”不是CLR知道或关心的东西……它在Assemblies中处理。

 private static List GetListOfEntryAssemblyWithReferences() { List listOfAssemblies = new List(); var mainAsm = Assembly.GetEntryAssembly(); listOfAssemblies.Add(mainAsm); foreach (var refAsmName in mainAsm.GetReferencedAssemblies()) { listOfAssemblies.Add(Assembly.Load(refAsmName)); } return listOfAssemblies; } 

注意事项:
1.你仍然需要过滤核心程序集System。* 2.这只是在ref链中的一个深层……但是可以递归地完成 – 使用更多的代码。

另外:某些程序集不会立即加载,因此您还应该在AppDomain的程序集加载事件上放置一个事件处理程序。

 AppDomain.CurrentDomain.AssemblyLoad += ....