【问题标题】:listing out namespaces used in dll [duplicate]列出 dll 中使用的命名空间 [重复]
【发布时间】:2012-08-09 05:30:24
【问题描述】:

可能重复:
Finding all Namespaces in an assembly using Reflection (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;

**

你能指导我吗..

等待您宝贵的cmets

【问题讨论】:

  • @Cory,topicstarter 想要找到所有类型,在汇编中使用,并使用它们构建命名空间列表,而不仅仅是他自己创建的类型。
  • @Dennis:点了。涉嫌重复撤销!

标签: c# .net namespaces


【解决方案1】:

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

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

我不知道,不分析 IL 代码如何做到这一点。 希望Cecil 可以帮助您...但这并不容易,也不是仅需要反思的任务。

引用MSDN中MethodBody类的备注:

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

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

【讨论】:

  • 没有命名空间,但有完全限定的类型名称 :)
  • @SimonWhitehead,更新了答案。
  • 谢谢@dennis,但是如果不使用带有反射的 cecil,我们可以检索代码或命名空间吗
  • @dennis 你说可以通过单声道我可以将它添加到我的参考并扫描 dll 以列出方法
  • @GowthamanSS: 1) 您可以获取程序集中每个类型中每个字段的类型 2) 您可以获取每个属性和方法的输入参数类型和返回值; 3)您甚至可以在每个方法中获取每个局部变量的类型(参见MethodBase.GetMethodBody 方法和MethodBody 类,尤其是备注部分)。 但是,我不知道如何在不分析 IL 的情况下查找静态方法调用(例如 LINQ 扩展方法) - 您必须获取相应的元数据令牌。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的 cmets 是否可以通过代码实现?
  • 我是代码。 Cci 是一组 dll,您可以使用它来创建执行您想要的程序。
【解决方案3】:

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

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

使用反射(如代码中的assembly.GetTypes())会在程序集中提供类型定义,而不是在程序集中使用

【讨论】:

  • 我不清楚你的解决方案.....
猜你喜欢
  • 2020-06-10
  • 2013-06-14
  • 1970-01-01
  • 2015-04-25
  • 2016-01-03
  • 2015-07-21
  • 1970-01-01
  • 2014-11-28
  • 2012-07-18
相关资源
最近更新 更多