2011-01-20 10 views
5

cuando decompilé un archivo dll con Reflector, vi que el método que necesito se implementa de la siguiente manera. Qué significa eso? ¿Es posible ver el código fuente detrás de esto?Descompilación de un método implementado con la palabra clave extern

[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); 

Saludos.

Respuesta

4

Esto es lo que ve cuando usa Reflector para ver una biblioteca de interoperabilidad COM que fue creada por tlbimp.exe. O agregando una referencia en el IDE a un servidor COM desde la pestaña COM o la pestaña Examinar, lo mismo.

Si observa la clase o interfaz externa que contiene este método, verá la COM coclass o interfaz que contiene este método. Los atributos importantes en él son [ComImport] para indicar que está implementado en otra DLL y [Guid], la interfaz más importante IID o CLASS cochlass. Las clases e interfaces COM están identificadas de forma exclusiva por un guid, no por un nombre. El GUID CLSID está presente en el registro, clave HKCR\CLSID\{guid}.

Los servidores COM como este casi siempre se implementan en un lenguaje no administrado, C++ es más típico, pero también Delphi o VB6. Descompilar el código de C++ después de compilarlo es un ejercicio infructuoso, pero puede obtener algo de Dumpbin.exe con la opción/disasm. Se requieren habilidades de programación de lenguaje ensamblador y cantidades de tiempo libre. Casi siempre está expresamente prohibido en el acuerdo de licencia.

+0

Tiene toda la razón, la interfaz comienza de la siguiente manera: [ComImport, TypeLibType ((short) 2), ClassInterface ((short) 0), Guid (" 1CA8A500- E55C-11CF-9D38-00A02457680B ")]. ¿Pero no entiendo cómo puedo llegar a "otra DLL"? Me gustaría intentarlo para comprender el montaje. – Feyyaz

1

Wat significa que este es un método en una DLL no administrada (interoperabilidad). Probablemente escrito en C++ y/o C

Puede intentar descompilar eso (usando otras herramientas, no Reflector) pero no será fácil y el resultado no será muy bueno.

+0

¿Quieres decir que llama a otra DLL, ¿verdad? ¿Cómo puedo encontrar esa otra DLL, entonces :) – Feyyaz

+0

Buena pregunta, generalmente se enumera en un atributo. No estoy seguro de cómo funciona esto. –

1

Parece que es una llamada a un dll no administrado (probablemente COM). Entonces el reflector no podría descompilar/desensamblarlo; pero si puede leer el ensamblador x86, puede llegar a algún lado.

+0

+1 El atributo 'DispId' está muerto para COM :) – leppie

Cuestiones relacionadas