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
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.
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.
- 1. Sự khác nhau giữa AxInterop và Interop là gì?
- 2. Sự khác nhau giữa một chuỗi COM (BSTR) và một chuỗi .NET là gì?
- 3. Sự khác nhau giữa COM DLL và ActiveX control
- 4. Sự khác nhau giữa WPF và WinForms là gì?
- 5. Sự khác nhau giữa JavaScript và Java là gì?
- 6. Sự khác nhau giữa ODBC và OleDB là gì?
- 7. Sự khác nhau giữa SGML và XML là gì?
- 8. Sự khác nhau giữa DefaultSelenium và RemoteWebDriver là gì?
- 9. Sự khác nhau giữa RMI và Corba là gì?
- 10. Sự khác nhau giữa scgi và wsgi là gì?
- 11. Sự khác nhau giữa wsHttpBinding và ws2007HttpBinding là gì?
- 12. Sự khác nhau giữa Pingback và Trackback là gì?
- 13. Trong Python, sự khác nhau giữa ".append()" và "+ = []" là gì?
- 14. Sự khác nhau giữa CellClick và CellMouseClick là gì?
- 15. Sự khác nhau giữa .bashrc, .bash_profile và .environment là gì?
- 16. Sự khác nhau giữa JSP và Facelets là gì?
- 17. Sự khác nhau giữa hg quên và hg là gì?
- 18. Sự khác nhau giữa GDI và GDI + là gì?
- 19. Sự khác nhau giữa đá quý và plugin là gì?
- 20. Sự khác nhau giữa metaClass.methods và metaClass.metaMethods là gì?
- 21. Sự khác nhau giữa kEND và $ end là gì?
- 22. Sự khác nhau giữa java và jsp là gì?
- 23. Sự khác nhau giữa Application.Run() và Form.ShowDialog() là gì?
- 24. Sự khác nhau giữa -0 và 0 là gì?
- 25. Sự khác nhau giữa HTTP 1.0 và 1.1 là gì?
- 26. Sự khác nhau giữa java.lang.Math và java.lang.StrictMath là gì?
- 27. Sự khác nhau giữa " " và "" là gì?
- 28. Sự khác nhau giữa Spring BeanFactoryAware và ApplicationContextAware là gì?
- 29. sự khác nhau giữa SCRIPT_FILENAME và SCRIPT_NAME là gì?
- 30. Sự khác nhau giữa JSP và JSTL là gì?
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
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. –