c# aseembly 反射.dll文件获取源代码的结构

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsProgramTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void openAssembleToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var openFile = new OpenFileDialog();
            if (openFile.ShowDialog(this) == DialogResult.OK)
            {
                var assembly = Assembly.LoadFile(openFile.FileName);
                var assemblyNode = new TreeNode(assembly.GetName().Name);
                this.treeView1.Nodes.Add(assemblyNode);
                //module
                var modules = assembly.GetModules();
                //foreach (var module in modules)
                foreach (var module in modules)
                {   //module view
                    var moduleNode = new TreeNode(module.Name);
                    assemblyNode.Nodes.Add(moduleNode);
                    //reference
                    var referenceNode = new TreeNode("Reference");
                    moduleNode.Nodes.Add(referenceNode);
                    var refers = assembly.GetReferencedAssemblies();
                    foreach (var refer in refers)
                    {
                        var referNode = new TreeNode(refer.Name);
                        referenceNode.Nodes.Add(referNode);
                    }
                    //types
                    Type[] typearr = null;
                    try
                    {
                        typearr= module.GetTypes();
                    }
                    catch(ReflectionTypeLoadException ex)
                    {
                        typearr = ex.Types;
                    }
                    //字典 分离键值对key-value(mul)
                    var typeGroup = new System.Collections.Generic.Dictionary <String, List<Type>>();
                    foreach (var type in typearr)
                    {
                        if (type == null) continue;
                        string np = null;
                        try
                        {
                            np = type.Namespace;
                        }
                        catch { }

                        if (String.IsNullOrEmpty(np))
                        {
                            np = "-";
                        }
                        if (typeGroup.ContainsKey(np))
                        {
                            typeGroup[np].Add(type);
                            continue;

                        }
                        var list = new List<Type>();
                        list.Add(type);
                        typeGroup.Add(np, list);
                    }
                    //显示namespace和class
                        foreach (var typeItem in typeGroup)
                        {
                          var nameSpaceNode = new TreeNode(typeItem.Key);
                          moduleNode.Nodes.Add(nameSpaceNode);

                           foreach ( var type in typeItem.Value)
                           {
                            var classNode = new TreeNode(type.Name);
                                nameSpaceNode.Nodes.Add(classNode);

                            //construc
                            var constructInfos = type.GetConstructors(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static|BindingFlags.DeclaredOnly|BindingFlags.Instance);

                            ParameterInfo[] consParameters = null;
                            String parsList = String.Empty;
                            try
                            {

                                foreach (var cons in constructInfos)
                                {
                                    consParameters = cons.GetParameters();
                                    var conlist = new List<String>();
                                    foreach (var consParameter in consParameters)
                                    {
                                        conlist.Add(consParameter.ParameterType.Name);
                                    }
                                    parsList = String.Join(" , ", conlist.ToArray());

                                    var constructNode = new TreeNode(cons.Name + "(" + parsList + ")");
                                    classNode.Nodes.Add(constructNode);
                                }
                            }
                            catch { }
                            //method
                            var methods = type.GetMethods(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static|BindingFlags.DeclaredOnly|BindingFlags.Instance);
                            foreach (var method in methods)
                            {
                                var methodName = method.Name;
                                if (method.IsSpecialName)
                                {
                                    continue;
                                }

                                string paramStr = string.Empty;
                                String methodRT = null;
                                try
                                {
                                    var parameters = method.GetParameters();
                                    var paraList = new List<String>();
                                    foreach (var parameter in parameters)
                                    {
                                        paraList.Add(parameter.ParameterType.Name);
                                    }
                                    paramStr = String.Join(", ", paraList.ToArray());
                                    methodRT = method.ReturnType.Name;
                                }
                                catch {
                                    paramStr = "UnKnow";
                                    methodRT = "methodRT_UnKnow";
                                }

                                var methodNode = new TreeNode(method.Name + "(" + paramStr + ")" + " : " + methodRT);
                                classNode.Nodes.Add(methodNode);
                            }
                            //property
                            var proInfos = type.GetProperties();

                            foreach (var proinfo in proInfos)
                            {
                                TreeNode proNode = null;
                                try
                                {
                                    proNode = new TreeNode(proinfo.Name + " : " + proinfo.PropertyType.Name);
                                    classNode.Nodes.Add(proNode);
                                }
                                catch {
                                    proNode = new TreeNode(proinfo.Name + " : " + "UnKnow");
                                    classNode.Nodes.Add(proNode);
                                }

                                MethodInfo  promethods = null;
                                ParameterInfo[] proParameters = null;
                               List<String> proList = null;
                                String parsStr2 = String.Empty;
                                String prt = null;
                                if (proinfo.CanRead)
                                {
                                    try
                                    {
                                        promethods = proinfo.GetMethod;
                                        proParameters = promethods.GetParameters();
                                         proList = new List<String>();
                                        foreach (var proParameter in proParameters)
                                        {
                                            proList.Add(proParameter.ParameterType.Name);
                                        }
                                        parsStr2 = string.Join(", ", proList.ToArray());
                                        prt = promethods.ReturnType.Name;
                                    }
                                    catch { }
                                    var proInfoNode = new TreeNode(promethods.Name + "(" + parsStr2 + ")" + prt );
                                    proNode.Nodes.Add(proInfoNode);
                                }
                                if (proinfo.CanWrite)
                                {  try
                                    {

                                        promethods = proinfo.GetMethod;
                                        proParameters = promethods.GetParameters();
                                        proList = new List<String>();
                                        foreach (var proParameter in proParameters)
                                        {
                                            proList.Add(proParameter.ParameterType.Name);
                                        }
                                    }
                                    catch { }
                                    var proInfoNode = new TreeNode(promethods.Name + "(" + string.Join(", ", proList.ToArray()) + ")" + promethods.ReturnType.Name);
                                    proNode.Nodes.Add(proInfoNode);
                                }

                                //filds
                                var filds = type.GetFields(BindingFlags.Public |
                                                           BindingFlags.Static |
                                                           BindingFlags.NonPublic |
                                                           BindingFlags.Instance |
                                                           BindingFlags.DeclaredOnly);
                                try
                                {
                                    foreach (var fildsInfo in filds)
                                    {
                                        var fildNode = new TreeNode(fildsInfo.Name + ": " + fildsInfo.FieldType.Name);
                                        classNode.Nodes.Add(fildNode);
                                    }
                                }
                                catch { }
                            }

                           }
                        }

                }
            }
        }
    }
}

时间: 2024-11-05 17:31:25

c# aseembly 反射.dll文件获取源代码的结构的相关文章

类库从自带的配置文件中获取信息(DLL文件 获取 DLL文件自带的配置信息) z

http://blog.csdn.net/shuaishifu/article/details/19602059 类库调用自身所带的配置文件中的配置信息,而不是读取应用程序所带的配置信息.代码如下: private Configuration GetConfig() { //获取调用当前正在执行的方法的方法的 Assembly Assembly assembly = Assembly.GetCallingAssembly(); string path = string.Format("{0}.c

浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂

var num = 1;    var str = '1';    var test = 1;    test == num  //true 相同类型 相同值    test === num //true 相同类型 相同值    test !== num //false test与num类型相同,其值也相同, 非运算肯定是false    num == str  //true 把str转换为数字,检查其是否相等.    num != str  //false == 的 非运算    num ==

::GetModuleFileName 获取DLL文件路径

通过GetModuleHandle(NULL, .., .. ); 只能获取到 EXE文件所在路径,如果需要获取DLL路径怎么办? 有如下两种办法: 1. 从DllMain(hModule, …)中获取DLL句柄,并传入GetModuleHandle(); 但有些DLL被封装过的很难找到hModule,如: MFC的DLL, vstest的UnitTest DLL 等. 2.  变量 IMAGE_DOS_HEADER __ImageBase 可以转换为 hModule,传入GetModuleHa

如何使一个你没有源代码的DLL文件变为强命名的DLL

转载: 有时候你会需要一个DLL是强命名的,比如你想把这个文件放到GAC里面.如果这是一个第三方的DLL,你没有源代码,这会是一件比较麻烦的事情.有一个方法可以解决这个问题. 在VS.NET的命名行窗口下,输入如下的代码. 1 ,生成一个KeyFile sn -k keyPair.snk 2, 得到程序集的MSIL ildasm SomeAssembly.dll /out:SomeAssembly.il 3 ,为了避免冲突,把原来的DLL文件改名 ren SomeAssembly.dll Som

调试带有源代码的DLL文件

工作环境:dll源代码是c,在Visual studio 2010中调试. 第一步,调试的准备. 用C#语言编写一个测试dll文件的程序,由于dll源程序是c的,且运行结果是黑屏的,所以C#代码也是运行在黑屏的console环境下.完整代码如下. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; na

反射示例1-----执行反射dll的方法和获取属性的值

项目结构: 将Document类库生成的DLL文件放在ConsoleApplication2\ConsoleApplication2\bin\Debug文件夹下 -------------------------------------------------------------Document.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst

lib和dll文件的区别和联系

什么是lib文件,lib和dll的关系如何 (2008-04-18 19:44:37)    (1)lib是编译时需要的,dll是运行时需要的. 如果要完成源代码的编译,有lib就够了. 如果也使动态连接的程序运行起来,有dll就够了. 在开发和调试阶段,当然最好都有. (2)一般的动态库程序有lib文件和dll文件.lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的.如果有 dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中.如果只有lib

Com组件和Dll文件区别

[转]COM组件和DLL的区别 2014-8-14阅读169 评论0 com英文为Component Object Model(组件对象模型),是微软生产软件组件的标准. 它是构造二进制兼容软件组件的规范,不管组件应用何种语言编写只要遵循com规范就可以相互直接通信.提出com规范主要是为了满足: 1.程序的快速开发,可以将一个大型的工程分成若干个com组件同时开发. 2.可以动态的插入或卸载com组件. 3.可以隐藏或封装com组件内部的实现细节. com组件可以由不同的语言进行编写,但com

VC++中.DLL文件与.LIB文件关系

一般的LIB文件是"导入库",用来提供给link.exe,作为链接DLL--也就是"动态链接库"的依据.里面记录了类似下面的信息:调用函数xxx(),连接到x.dll的0xABCDEFGH地址:-- 早期的LIB,是"静态链接库",也是用来提供给link.exe,作为链接代码用的.里面的记录如下:调用xxx(),其代码是--:DLL的LIB(导入库),不含可执行的具体代码(代码在DLL中).而最早的LIB(静态链接库),里面含有代码.所以,可以看