首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#反射:在解决方案中获取*所有*活动程序集?

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

Stack Overflow用户
提问于 2009-05-12 05:23:06
回答 3查看 52.6K关注 0票数 37

这就是我的问题:

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

在" common“中,我有一个用于常见反射任务的类,比如创建一个实例。如果我调用GetExecutingAssembly,它会得到所有的“通用”类型,但是当我使用GetEntryAssembly时,我会得到“程序”类型。

虽然我当然可以编辑代码来使用2组asm,但我担心解决方案中有超过2个项目的情况-假设有5个(不知道为什么,但让我们暂时转到那里),并且我担心调用GetExecutingAssembly和GetEntryAssembly不会获得整个程序中的所有类型。

我还能做些什么来获取解决方案中的所有类型吗

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-12 05:35:56

代码语言:javascript
复制
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();

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

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

票数 81
EN

Stack Overflow用户

发布于 2012-04-21 05:14:46

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

代码语言:javascript
复制
    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);

    }
票数 44
EN

Stack Overflow用户

发布于 2009-05-12 05:57:23

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

代码语言:javascript
复制
AppDomain.CurrentDomain.AssemblyLoad += ....
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/851248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档