2011-01-20 27 views
5

khi tôi dịch ngược một tệp dll bằng Reflector, tôi thấy rằng phương pháp tôi cần được triển khai như dưới đây. Nó có nghĩa là gì? Có thể xem mã nguồn đằng sau nó không?Decompiling a Method Được thực hiện với từ khóa 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); 

Kính trọng.

Trả lời

4

Đây là những gì bạn thấy khi bạn sử dụng Reflector để xem thư viện COM interop được tạo bởi tlbimp.exe. Hoặc bằng cách thêm một tham chiếu trong IDE vào máy chủ COM từ tab COM hoặc tab Duyệt, cùng một điều.

Nếu bạn nhìn vào lớp bên ngoài hoặc giao diện có chứa phương pháp này thì bạn sẽ thấy COM coclass hoặc giao diện có chứa phương pháp này. Các thuộc tính quan trọng trên nó là [ComImport] để chỉ ra rằng nó được thực hiện trong một DLL và [Guid], tất cả giao diện quan trọng IID hoặc coclass CLSID. Các lớp và giao diện COM được xác định duy nhất bởi một guid, không phải là một tên. Hướng dẫn CLSID có trong sổ đăng ký, khóa HKCR\CLSID\{guid}.

Máy chủ COM như thế này hầu như luôn được triển khai bằng ngôn ngữ không được quản lý, C++ là điển hình nhất, nhưng cũng là Delphi hoặc VB6. Việc biên dịch mã C++ sau khi nó được biên dịch là một bài tập không kết quả nhưng bạn có thể lấy một thứ gì đó từ Dumpbin.exe bằng tùy chọn/disasm. Kỹ năng lập trình ngôn ngữ hội và các thời gian rảnh là bắt buộc. Nó gần như luôn luôn bị cấm trong thỏa thuận cấp phép.

+0

Bạn hoàn toàn đúng, giao diện bắt đầu như sau: [ComImport, TypeLibType ((short) 2), ClassInterface ((short) 0), Guid (" 1CA8A500- E55C-11CF-9D38-00A02457680B ")]. Nhưng tôi không hiểu làm thế nào tôi có thể đạt được "một DLL"? Tôi muốn cho nó một cố gắng để hiểu hội đồng. – Feyyaz

1

Wat có nghĩa là đây là phương pháp trong một DLL không được quản lý (interop). Nhiều khả năng được viết bằng C++ và/hoặc C

Bạn có thể thử dịch ngược (sử dụng các công cụ khác, không phản xạ) nhưng sẽ không dễ dàng và kết quả sẽ không tốt lắm.

+0

Ý bạn là nó gọi một DLL khác, phải không? Làm thế nào tôi có thể tìm thấy rằng DLL khác, sau đó :) – Feyyaz

+0

Câu hỏi hay, nó thường được liệt kê trong một thuộc tính. Bạn không chắc chắn cách thức hoạt động của tính năng này. –

1

Có vẻ như đó là cuộc gọi đến một dll không được quản lý (có thể là COM). Vì vậy, phản xạ sẽ không thể dịch ngược/tháo rời nó; nhưng nếu bạn có thể đọc x86 assembler bạn có thể có được một nơi nào đó.

+0

+1 'DispId' thuộc tính là giveaway chết cho COM :) – leppie

Các vấn đề liên quan