2013-10-08 16 views
6

Trong Windows API Code Pack for .NET Framework, nhiều phương pháp của các giao diện COM Interop được trang trí với MethodImplAttribute, ví dụ: giá trịMethodImplAttribute (InternalCall, Runtime) làm gì cho các phương thức của giao diện COM Interop?

internal interface IShellItem 
{ 
    [PreserveSig] 
    [MethodImpl(
     MethodImplOptions.InternalCall, 
     MethodCodeType = MethodCodeType.Runtime)] 
    HResult BindToHandler(
     [In] IntPtr pbc, [In] ref Guid bhid, [In] ref Guid riid, 
     [Out, MarshalAs(UnmanagedType.Interface)] out IShellFolder ppv); 

Tài liệu cho MethodImplOptions.InternalCall nói:

Cuộc gọi là nội bộ, có nghĩa là, nó gọi một phương pháp được triển khai trong thời gian chạy ngôn ngữ chung.

Tài liệu cho MethodCodeType.Runtime nói:

Chỉ định rằng việc thực hiện phương pháp được cung cấp bởi bộ thực thi.

Nhưng, nếu tôi hiểu chính xác, không phải câu nào là chính xác. IShellItem is implemented in shell32.dll, theo MSDN. shell32.dll không phải là một phần của CLR. Điều thú vị, không phải tất cả các phương pháp đều có MethodImplAttribute. IShellFolder làm, IShellLinkW không, IShellLibrary làm, IPersistStream không, vv

Tại sao MethodImplAttribute áp dụng cho một số các giao diện COM Interop? Nó có ý nghĩa gì trong trường hợp này và nó thay đổi hành vi của interop như thế nào?

Trả lời

8

Nó chỉ là một tác dụng phụ từ cách lập trình viên Microsoft nhận được khai báo giao diện. Một số giao diện shell có sẵn trong một thư viện kiểu, giống như IShellItem, vì vậy cách dễ nhất để đưa chúng vào mã nguồn là chạy Tlbimp.exe để tạo ra thư viện interop và bộ tách rời để biên dịch assembly thành mã C#. Mà cũng mang lại các thuộc tính phụ mà Tlbimp.exe tạo ra, như [MethodImpl].

Các giao diện khác không có sẵn trong thư viện kiểu, như IShellLinkW và IPersistStream, cũng như không thể tạo thư viện kiểu từ IDL để người lập trình không có lựa chọn nào ngoài việc nhập chúng vào chính mình. Anh bỏ qua những thứ không cần thiết.

Và không, [MethodImpl] không quan trọng ở đây. Đây là những loại giao diện nên không có phương thức nào. Tlbimp.exe không quá phức tạp về nó.

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