Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从.Net DLL获取公共导出列表?_C#_.net_Dll - Fatal编程技术网

C# 如何从.Net DLL获取公共导出列表?

C# 如何从.Net DLL获取公共导出列表?,c#,.net,dll,C#,.net,Dll,我可以使用“dumpbin”和“dll export”等工具查看标准win32 dll(如Windows\SYSTEM32\GDI32.dll)的公共入口点(“导出”)。但是当我在.Net DLL上使用这些相同的工具时,我看到的是 我有一个C#/.Net DLL,它提供了控制工业过程的入口点,我想对照我们的文档检查它的公共入口点,以确保公共文档的完整性。什么工具显示.Net DLL的公共入口点 我尝试过Jetbrains DotPeek,它将我们的DLL完全反编译成C#源代码,但这太过分了,因为

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

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


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

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

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();
但这忽略了嵌套类和属性,并且可能应该以几种方式进行扩展以满足问题的需要。

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

使用visual Studio对象浏览器怎么样

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

  • 所有具有公共方法和属性的公共类和接口都可以看作.NET程序集的“公共导出”。因此,您可以使用一些反编译器手动检查它(就像您已经做的那样),或者尝试使用反射编写代码以列出所有此类方法。托管程序集不使用非托管导出。要做到这一点,有很多方法,明智的方法是编写单元测试。不确定单元测试如何解决这个问题。我们的目标是确保当用户拥有我们的DLL时,所有通过DLL公开可见的内容都被记录下来。显然,我们可以通过研究源代码或程序集来推测什么是公开可见的,但这只是一种猜测。了解DLL公开的内容是一个经验测试,或者至少我们是这样使用旧的Win32 DLL的。程序集和源代码告诉我们什么应该是公共可见的,我希望DLL能够提供一个双重检查,以验证什么实际上是公共可见的。这是因为.NET是基于组件的编程。不需要对导出defs和导出代码进行双重检查。每个公共组件都是可用的,元数据(可通过反射访问)描述了它们。客户端引用程序集,并通过元数据知道可用的内容。由于旧的Win32 DLL在dumpbin之类的工具中查看导出,因此在编译和构建环境中检查源代码和其他文件时,会提供一个经验性的双重检查。正如我在有问题的评论中所说,没有“双重检查”的地方在基于组件编程的情况下的想法。
    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();