2010-06-29 47 views
15

Hãy để chúng tôi nói rằng tôi đang truy cập thư viện của bên thứ ba, trong đó tài liệu nêu rõ rằng tôi có thể sử dụng pInvoke hoặc tạo thư viện interop và sử dụng COM. Sự khác biệt giữa hai kỹ thuật này là gì và tại sao tôi có thể chọn một kỹ thuật khác?Sự khác nhau giữa pInvoke và COM Interop là gì?

Trả lời

12

P/Invoke được sử dụng để gọi các API đơn giản-C (giống như hầu hết API Win32). COM interop được sử dụng để gọi các đối tượng COM.

Bạn có thể tạo trình bao bọc C++ COM xung quanh API C và sau đó sử dụng COM interop để gọi trình bao bọc của bạn nếu số lượng cuộc gọi API tương đối cao (và bạn có thể sử dụng trình bao bọc COM để đóng gói chúng thành một hoặc hai cuộc gọi). Điều này là do interop có nguồn gốc quản lý có thể tương đối đắt và tốt nhất là giảm thiểu số lần chuyển đổi. Mặc dù thực sự tôi sẽ nói rằng việc sử dụng C++/CLI để tạo trình bao bọc có lẽ sẽ thân thiện hơn một chút đối với mặt C# (xem SlimDX, ví dụ, là trình bao bọc C++/CLI xung quanh một API COM (DirectX)). Có nói rằng, trừ khi bạn có một vấn đề hiệu suất cụ thể, tôi sẽ chỉ sử dụng phương pháp nào là tự nhiên hơn cho API bạn đang cố gắng gọi: nếu đó là một API C (giống như API Win32) thì hãy sử dụng P./Gọi. Nếu đó là COM-based, sau đó sử dụng COM interop.

+0

Vì vậy, bạn đang nói rằng dưới mui xe, COM interops đang làm việc pinvokes mình? Và đó COM chỉ là một wrapper thân thiện? – Grant

+2

Không, COM interop và P/Invoke là khác nhau và một không được thực hiện theo cách khác. Những gì tôi đã nói trong đoạn thứ hai của tôi là nếu C API là "chatty" và đòi hỏi nhiều cuộc gọi hàm, bạn có thể tạo một wrapper COM (trong C++) và gọi * wrapper * từ C# để giảm số lượng managed- chuyển đổi bản địa. Tôi nghi ngờ đó là những gì tài liệu cho thư viện của bạn được đề xuất. –

3

PInvoke sử dụng cơ chế liên kết động để đưa mã bên ngoài vào quá trình thực thi. Thư viện liên kết động (DLL) phải có kiến ​​trúc đích giống như ứng dụng gọi điện, do đó không có khả năng thực hiện cuộc gọi chéo từ 64 bit đến 32 bit hoặc ngược lại. Thay vào đó, DLL được ánh xạ vào không gian địa chỉ của người gọi và được thực hiện trong tiến trình.

COM, DCOM, COM + và ActiveX đều dựa trên các thư viện truyền thông liên bộ, nhưng đôi khi có thể chuyển thành một tải DLL đơn giản. Các đối tượng liên kết COM có liên quan, nhưng không giống với các đối tượng CORBA, nhưng trong khi Corba phát triển trình định vị đối tượng riêng của nó, việc triển khai COM vẫn dựa trên các thư viện RPC và XDR của Sun Microsystems với các phần mở rộng cho các tính năng hướng đối tượng của COM. Các đối tượng COM được tham chiếu không phải bởi DLL, mà bởi một GUID được sử dụng để tra cứu lớp đối tượng và truy vấn các giao diện của nó. Mã đối tượng thường chạy trong một tiến trình riêng biệt và có thể trên một máy chủ riêng biệt.

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