2011-01-20 18 views
5

quando ho decompilato un file dll con Reflector, ho visto che il metodo di cui ho bisogno è implementato come di seguito. Cosa significa? È possibile vedere il codice sorgente dietro di esso?Decompilazione di un metodo Implementato con la parola chiave 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); 

Cordiali saluti.

risposta

4

Questo è ciò che viene visualizzato quando si utilizza Reflector per esaminare una libreria di interoperabilità COM creata da tlbimp.exe. O aggiungendo un riferimento nell'IDE a un server COM dalla scheda COM o la scheda Sfoglia, stessa cosa.

Se si guarda la classe esterna o l'interfaccia che contiene questo metodo, verrà visualizzata la coclasse COM o l'interfaccia che contiene questo metodo. Attributi importanti sono [ComImport] per indicare che è implementato in un'altra DLL e [Guid], l'IID dell'interfaccia importante o CLSID della coclasse. Le classi COM e le interfacce sono identificate in modo univoco da un guid, non da un nome. Il codice CLSID è presente nel registro, chiave HKCR\CLSID\{guid}.

I server COM come questo sono quasi sempre implementati in un linguaggio non gestito, il C++ è il più tipico, ma anche Delphi o VB6. Decompilare il codice C++ dopo che è stato compilato è un esercizio infruttuoso, ma è possibile ottenere qualcosa da Dumpbin.exe con l'opzione/disasm. Sono richieste capacità di programmazione linguistica di assemblaggio e risme di tempo libero. È quasi sempre espressamente vietato nel contratto di licenza.

+0

Hai perfettamente ragione, l'interfaccia inizia come segue: [ComImport, TypeLibType ((short) 2), ClassInterface ((short) 0), Guid (" 1CA8A500- E55C-11CF-9D38-00A02457680B ")]. Ma non capisco come posso raggiungere "un'altra DLL"? Mi piacerebbe fare un tentativo per capire l'assemblea. – Feyyaz

1

Wat significa che si tratta di un metodo in una DLL non gestita (di interoperabilità). Molto probabilmente scritto in C++ e/o C

Si potrebbe provare a decompilarlo (usando altri strumenti, non Reflector) ma non sarà facile e il risultato non sarà molto buono.

+0

Significa che chiama un'altra DLL, giusto? Come posso trovare quell'altra DLL, quindi :) – Feyyaz

+0

Buona domanda, di solito è elencata in un attributo. Non sono sicuro di come funzioni. –

1

Sembra che sia una chiamata a una dll non gestita (probabilmente COM). Quindi il riflettore non sarebbe in grado di decompilarlo/smontarlo; ma se riesci a leggere l'assembler x86 potresti essere in grado di andare da qualche parte.

+0

+1 L'attributo 'DispId' è un omaggio scaduto per COM :) – leppie

Problemi correlati