【问题标题】:How can I get a list of public exports from a .Net DLL?如何从 .Net DLL 获取公共导出列表?
【发布时间】:2014-01-22 21:40:11
【问题描述】:

我可以使用“dumpbin”和“dll export”之类的工具来查看 Windows\SYSTEM32\GDI32.dll 等标准 win32 DLL 的公共入口点(“exports”)。但是当我在 .Net DLL 上使用这些相同的工具时,我看到的只是

    2000 .reloc
    2000 .rsrc
   48000 .text

我有一个 C#/.Net DLL,它提供入口点来控制工业流程,我想根据我们的文档检查它的公共入口点,以确保公共文档的完整性。什么工具显示 .Net DLL 的公共入口点?

我尝试过 Jetbrains DotPeek,它可以将我们的 DLL 完全反编译为 C# 源代码,但这太过分了,因为它显示了所有内容,并且似乎没有摘要模式,它只报告公共入口点。

【问题讨论】:

  • 所有具有公共方法和属性的公共类和接口都可以看作是.NET程序集的“公共出口”。因此,您可以使用一些反编译器手动查看它(就像您已经做过的那样)或尝试使用反射编写代码来列出所有此类方法。
  • 托管程序集不使用非托管导出。解决这个问题的方法很多,最明智的方法是编写单元测试。
  • 不确定单元测试如何解决这个问题。我们的目标是确保当用户拥有我们的 DLL 时,通过 DLL 公开可见的所有内容都被记录在案。显然,我们可以通过研究源代码或程序集来推测公开可见的内容,但这只是一个推测。知道 DLL 暴露了什么是经验测试,或者至少我们是这样使用旧的 Win32 DLL 的。程序集和源代码告诉我们什么应该公开可见,我希望 DLL 可以对实际经验上的公开可见提供双重检查。
  • 这是因为 .NET 是基于组件的编程。无需仔细检查导出 defs 与导出代码。每个公共组件都是可用的,元数据(可通过反射访问)描述它们。客户端引用程序集并通过元数据知道可用的内容。

标签: c# .net dll


【解决方案1】:

我假设“入口点”是指“公共类和方法”

Visual Studio 对象浏览器怎么样?

  1. 创建一个测试项目
  2. 添加对要检查的 DLL 的引用。
  3. 双击引用打开对象浏览器
  4. 点击“齿轮”小图标并取消选中“显示私人成员”、“显示受保护成员”、“显示其他成员”,这样您就只能看到公共内容。
  5. 开始浏览。

【讨论】:

    【解决方案2】:

    仅作为起点,如何列出当前程序集中的所有公共类型并列出其中的所有公共方法:

    Assembly assembly = Assembly.GetExecutingAssembly();
    var exports = 
    assembly.GetExportedTypes()
            .SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.Public)
                                    .Select(member => new
                                    {
                                        type.FullName,
                                        Member = member.ToString()
                                    }))
            .ToList();
    

    但这省略了嵌套类、属性,并且可能应该以几种方式扩展以满足问题需求。

    【讨论】:

    • 随着旧版 Win32 DLL 在像 dumpbin 这样的工具中查看导出,提供了一个经验性的双重检查,以检查编译和构建环境中的源代码和其他文件所指示的内容。
    • 正如我在问题评论中所说,在基于组件的编程中没有“双重检查”的想法。
    猜你喜欢
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2013-12-13
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2011-08-26
    相关资源
    最近更新 更多