1

可能重复:
使用反射 (DotNET) 查找程序集中的所有命名空间

让我们考虑一下我有 10 到 30 个 dll 的列表,我需要列出这些 dll 导入的所有命名空间。

我尝试使用反射作为以下代码

string[] fileEntries = Directory.GetFiles(sDir, "*.dll");
                foreach (string fileName in fileEntries)
                {
                    Assembly assembly = Assembly.LoadFrom(fileName);
                    List<string> namespaces = new List<string>();
                    foreach (var type in assembly.GetTypes())
                    {
                        string ns = type.Namespace;
                        if (!namespaces.Contains(ns))
                        {
                            namespaces.Add(ns);
                            Console.WriteLine(ns);
                        }
                    }

                }

但它只检索那些 dll 的唯一名称空间。

例如让我们考虑一个程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

namespace sample
{
    public partial class sample : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string pth = filepth("D:/sample1/s.txt");
            createfile(pth);
            Response.Write("File created on path :" + pth);
        }
     }      
}

基于上面的代码,它只检索示例,但我需要检索所有用作

**

using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.IO;

**

你能指导我吗..

等待您的宝贵意见

4

3 回答 3

2

运行时没有任何命名空间。此外,在您提供的示例中,并没有使用源代码中的每个命名空间(从上下文菜单中执行“组织使用 -> 删除未使用的使用”)。

您可以查找特定程序集的引用程序集,而不是命名空间。为了做你想做的事,你需要知道一种类型,在特定的汇编代码中使用(未声明,这很容易获得!)。

我不知道,如果不分析 IL 代码,如何做到这一点。希望,塞西尔可以帮助你......但这并不容易,也不是只有反思的任务。

引用MethodBodyMSDN 中的课堂备注:

您可以使用模块类的令牌解析方法,如ResolveType、ResolveMethod和ResolveType,将方法体中的令牌解析为提供类型、方法详细信息的Type对象、MethodInfo对象和FieldInfo对象,以及方法主体中 MSIL 访问的字段。解析方法体需要对元数据和 MSIL 指令格式有透彻的了解。可以在公共语言基础结构 (CLI) 文档中找到信息

您想自己学习 CLI 规范吗?:)

于 2012-08-09T05:38:44.647 回答
0

你想要的不是一件容易的事,反思当然不是要走的路。主要是因为它不会让您访问引用他们正在使用的类的方法的来源。

我能想到的唯一解决方案是作为cci的工具,它为您提供遍历 dll 的所有组件的方法。特别是您可以访问每行代码引用的每种类型/方法,并生成您想要的列表。

于 2012-08-09T05:38:53.127 回答
0

右键单击using块,您会在上下文菜单中找到“组织使用”,其中有一个名为“删除未使用的使用”的功能。

上面的句子与您的问题无关,但它告诉我们一个事实,即 .cs 文件顶部的 using 块中的 usings 有时不使用。除非您像 Visual Studio 那样分析整个代码,否则很难判断是否使用了命名空间。

并且使用反射,就像assembly.GetTypes()在你的代码中一样,给出了在程序集中定义的类型,而不是在程序集中使用的类型。

于 2012-08-09T05:42:25.267 回答