我想问一下,反射一般是用来获取一个程序集或者类中的成员信息的,并且可以用invoke调用它,但是我现在想知道的是:当你知道了一个动态链接库的某个成员后,能否得到它来之哪个类,并且能否通过它得到它所在的动态链接库名。这样我就可以得到所有的信息了。

解决方案 »

  1.   

    那就用MSIL 汇编程序 (Ilasm.exe)
      

  2.   

    MSIL 汇编程序从 MSIL 汇编语言生成可移植可执行的 (PE) 文件。可以运行结果可执行文件(该文件包含 MSIL 和所需的元数据)以确定 MSIL 是否按预期执行。
    ilasm [options] filename [[options]filename...]
    参数说明
    filename.il 源文件的名称。该文件包含元数据声明指令和符号化 MSIL 指令。可以提供多个源文件参数,以便用 Ilasm.exe 生成一个 PE 文件。
    选项说明
    /alignment=integer将 FileAlignment 设置为由 NT Optional 标题中的 integer 指定的值。如果在文件中指定了 .alignment IL 指令,则此选项将重写它。
    /base=integer将 ImageBase 设置为由 NT Optional 标题中的 integer 指定的值。如果在文件指定了 .imagebase IL 指令,则此选项将重写它。
    /clock为指定的 .il 源文件测量并报告下列编译时间(以毫秒为单位): 
    总运行时间 
    执行后面的所有特定操作所花费的总时间。 
    启动 
    加载并打开文件。 
    分析 
    发出 MD 
    发出元数据。 
    定义引用解析 
    解析对文件中的定义的引用。 
    修正和链接 
    CEE 文件生成 
    在内存中生成文件映像。 
    PE 文件写入 
    将映像写入 PE 文件。 
    /debug包括调试信息(局部变量名和参数名以及行号)。
    /dll生成 .dll 文件作为输出。
    /exe生成可执行文件作为输出。这是默认值。
    /flags=integer将 ImageFlags 设置为由公共语言运行库标题中的 integer 指定的值。如果在文件中指定了 .corflags IL 指令,则此选项将重写它。有关 integer 的有效值的列表,请参见 CorHdr.h 中的 COMIMAGE_FLAGS。
    /key:keyFile使用 keyFile 中包含的私钥编译具有强签名的 filename。
    /key:@keySource使用在 keySource 中生成的私钥编译具有强签名的 filename。
    /listing在标准输出上生成列表文件。如果省略此选项,则不生成列表文件。
    /nologo取消显示 Microsoft 启动标题。
    /output:file.ext指定输出文件名和扩展名。默认情况下,输出文件名与第一个源文件名相同。默认扩展名为 .exe。如果指定 /dll 选项,则默认扩展名为 .dll。 
    注意   指定 /output:myfile.dll 并不会设置 /dll 选项。如果不指定 /dll,则会生成名为 myfile.dll 的可执行文件。
    /quiet指定安静模式;不报告程序集进度。
    /resource:file.res在生成的 .exe 或 .dll 文件中包括 *.res 格式的指定资源文件。使用 /resource 选项只能指定一个 .res 文件。
    /subsystem=integer将 subsystem 设置为由 NT Optional 标题中的 integer 指定的值。如果在文件中指定了 .subsystem IL 指令,则此命令将重写它。有关 integer 的有效值的列表,请参见 winnt.h 中的 IMAGE_SUBSYSTEM。
    /?显示此工具的命令语法和选项。注意   Ilasm.exe 的所有选项都不区分大小写,并且根据前三个字母识别。例如,/lis 等效于 /listing 而 /res:myresfile.res 等效于 /resource:myresfile.res。指定参数的选项接受用冒号 (:) 或等号 (=) 作为选项和参数之间的分隔符。例如,/output:file.ext 等效于 /output=file.ext。
    备注
    MSIL 汇编程序有助于工具供应商设计和实现 MSIL 生成器。通过使用 Ilasm.exe,工具和编译器开发人员可以专注于生成 MSIL 和元数据,而无需考虑以 PE 文件格式发出 MSIL。
    与面向运行库的其他编译器(如 C# 和 Visual Basic .NET)类似,Ilasm.exe 不产生中间对象文件,并且不需要链接阶段即可形成 PE 文件。
    MSIL 汇编程序可以表达以运行库为目标的编程语言的所有现有元数据和 MSIL 功能。这使得用上面任何编程语言编写的托管代码都可以在 MSIL 汇编程序中充分表达并且可以用 Ilasm.exe 编译。
    可以将 Ilasm.exe 同它的伙伴工具 Ildasm.exe 一起使用。Ildasm.exe 采用包含 MSIL 代码的 PE 文件并创建相应的文本文件作为 Ilasm.exe 的输入。这很有用,例如当编译用并非支持所有运行库元数据属性的编程语言编写的代码时。通过 Ildasm.exe 编译该代码并运行输出后,可以手动编辑结果 MSIL 文本文件以添加缺少的属性。然后可以通过 Ilasm.exe 运行此文本文件以生成最终的可执行文件。
    也可以使用此方法从最初由不同的编译器生成的数个 PE 文件生成一个 PE 文件。
    注意   目前,无法对包含嵌入的本机代码的 PE 文件(例如,由 Visual C++ .NET 生成的 PE 文件)使用此技术。
    为使 Ildasm.exe 和 Ilasm.exe 的这种组合使用尽可能准确,此汇编程序不执行某些简单的优化,即不推断是使用短格式指令还是使用长格式指令。例如,此工具不会尝试确定它是否可以用短编码替换长编码,这些长编码可能是在 MSIL 源中编写的,也可能是由其他编译器发出的。如果需要短编码,则必须显式编写该格式。但是,此汇编程序在可能的情况下,还是会检查是否有超出范围的条件。
    注意   Ildasm.exe 只对磁盘上的文件进行操作。它不对安装在全局程序集缓存中的文件进行操作。
    示例
    下面的命令对 MSIL 文件 myTestFile.il 进行汇编并产生可执行文件 myTestFile.exe。
    ilasm myTestFile
    下面的命令对 MSIL 文件 myTestFile.il 进行汇编并产生 .dll 文件 myTestFile.dll。
    ilasm myTestFile /dll 
    下面的命令对 MSIL 文件 myTestFile.il 进行汇编并产生 .dll 文件 myNewTestFile.dll。
    ilasm myTestFile /dll /output:myNewTestFile.dll
      

  3.   

    >>> 能否得到它来之哪个类
    MemberInfo.DeclaringType>>> 并且能否通过它得到它所在的动态链接库名
    Type.Assembly.FullName
      

  4.   

    对反射的应用是从程序集--->到模块----->类型---->方法\属性等,层层往下发现的,当你都知道了这个库的成员,当然之前应该已经知道了库名的
      

  5.   

    我不想用Ilasm.exe,因为我要在程序中简单的实现。
    >>> 能否得到它来之哪个类
    MemberInfo.DeclaringType>>> 并且能否通过它得到它所在的动态链接库名
    Type.Assembly.FullName
    我试试这个行不行。