【问题标题】:Decompiling a Method Implemented with extern keyword反编译使用 extern 关键字实现的方法
【发布时间】:2011-01-20 08:41:57
【问题描述】:

当我用Reflector反编译一个dll文件时,我看到我需要的方法实现如下。这是什么意思?是不是可以看到它背后的源代码?

[return: MarshalAs(UnmanagedType.BStr)]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(0x3a)]
public virtual extern string GetCOLDText([In] int PageNumber, [In] int Row, [In] int Column, [In, Optional, DefaultParameterValue(0x7fffffff)] int Length);

问候。

【问题讨论】:

    标签: c# dll decompiling extern reflector


    【解决方案1】:

    这是您在使用 Reflector 查看由 tlbimp.exe 创建的 COM 互操作库时所看到的。或者通过在 IDE 中从 COM 选项卡或浏览选项卡添加对 COM 服务器的引用,同样的事情。

    如果您查看包含此方法的外部类或接口,您将看到包含此​​方法的 COM 组件类或接口。它的重要属性是 [ComImport] 指示它在另一个 DLL 和 [Guid] 中实现,所有重要的接口 IID 或 coclass CLSID。 COM 类和接口由 guid 唯一标识,而不是名称。 CLSID guid 存在于注册表中,HKCR\CLSID\{guid} 键。

    像这样的 COM 服务器几乎总是用非托管语言实现,C++ 是最典型的,还有 Delphi 或 VB6。在编译后反编译 C++ 代码是徒劳的,但您可以使用 /disasm 选项从 Dumpbin.exe 中获得一些东西。需要汇编语言编程技能和大量空闲时间。几乎总是在许可协议中明确禁止。

    【讨论】:

    • 你完全正确,界面开头如下:[ComImport, TypeLibType((short) 2), ClassInterface((short) 0), Guid("1CA8A500-E55C-11CF-9D38-00A02457680B ")]。但我不明白如何才能访问“另一个 DLL”?我想尝试一下了解程序集。
    【解决方案2】:

    这意味着这是一个非托管(互操作)DLL 中的方法。最有可能用 C++ 和/或 C 编写

    您可以尝试反编译(使用其他工具,而不是 Reflector),但这并不容易,结果也不会很好。

    【讨论】:

    • 你的意思是它调用了另一个DLL,对吧?我怎样才能找到其他 DLL,然后 :)
    • 好问题,它通常列在一个属性中。不知道这个是如何工作的。
    【解决方案3】:

    看起来这是对非托管(可能是 COM)dll 的调用。所以反射器将无法反编译/反汇编它;但如果你能读懂 x86 汇编器,你可能会有所收获。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      相关资源
      最近更新 更多