C#反射:获取解决方案中的所有活动程序集?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

我的问题是:

我有两个项目--一个“公共”项目,它的作用就像一个有各种支持代码的库,以及在许多调用中使用上述项目的实际程序。我们将这些项目称为“公共”和“计划”。两者的解决方案是一致的。

在“公共”中,我有一个用于逗号反射任务的类,比如创建一个实例。如果我调用GetExecutingAssembly,它会得到所有的“公共”类型,但是当我使用GetEntry程序集时,就会得到“Program”类型。

虽然我当然可以编辑代码来处理2组ASM,但我担心解决方案中有超过2个项目--让我们说5个(不知道为什么,但现在就让我们去那里),我担心调用GetExecutingAssembly和GetEntry Assembly并不能获得整个程序中的所有类型。

提问于
用户回答回答于
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();

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

正如注释中所指出的,可以生成多个AppDomain,在这种情况下,每个都可以有自己的程序集。这样做的直接好处是可以通过卸载包含的AppDomain卸载程序集。

用户回答回答于

这里有一个完整的实现:

    public static IEnumerable<Assembly> GetAssemblies()
    {
        var list = new List<string>();
        var stack = new Stack<Assembly>();

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

    }

扫码关注云+社区