2012-06-07 38 views
6

Trong dự án của chúng tôi, chúng tôi đang tái sử dụng rất nhiều mã Delphi thông qua COM trong ứng dụng asp.net của chúng tôi.Tại sao COM interop được ưu tiên hơn P/Gọi trong .NET?

Như thế này: di sản delphi dll => delphi COM wrapper => Net interop => asp.net (MVC)

Chúng tôi có một số vấn đề liên quan đến vi phạm truy cập, dỡ của dll, vv ... Tôi có bây giờ đã chuyển một số để sử dụng dll kế thừa trực tiếp thông qua mã P/Invoke.

Khi tôi xem các tài nguyên liên quan đến COM và P/Invoke, mọi người hầu như luôn luôn tư vấn để sử dụng COM. Tại sao vậy? Không P/Invoke có những lợi ích sau:

  • kiểm tra ra mã sẽ luôn luôn sử dụng dll đúng thay vì COM đăng ký cuối cùng
  • Nhiều phiên bản có thể chạy song song trên các máy chủ (ví dụ : DEV, TEST và QA)
  • Không còn COM đăng ký rắc rối
  • nhanh hơn chức năng giao tiếp COM (bài báo tôi đọc thấy một sự gia tăng tốc độ 30%)
+0

bạn có thể p/gọi vào dll 32 bit từ quy trình 64 bit không? Tôi không nghĩ vậy. – Bond

+1

Bạn có thể đưa ra một số tài liệu tham khảo đề xuất COM được ưa thích hơn với P/Invoke không? Tôi rất đồng ý với bạn rằng P/Invoke là giải pháp tốt hơn nếu có. Hầu hết các internals trong .NET BCL được thực hiện theo P/Invoke đến các API Win32. Chỉ có lý do để sử dụng COM interop là nơi bạn không có lựa chọn, ví dụ: interop với các ứng dụng Office hoặc các phần Windows API chỉ có COM. – Govert

+0

Hãy nhớ địa ngục DLL? Thay vì sử dụng dll chính xác, mã của bạn sẽ sử dụng dll có sẵn đầu tiên có cùng tên. Bất kỳ thay đổi API nào sẽ không được phát hiện cho đến khi thời gian chạy, điều đó có nghĩa là việc phiên bản là tất cả nhưng không thể. Bạn không thể tạo một DLL sẽ phục vụ cả khách hàng cũ và mới hơn mà không thay đổi tên của các hàm mình –

Trả lời

8

PInvoke là một công cụ rất tốt đẹp, nhưng nó chắc chắn là n o thay thế cho COM. Pinvoke chỉ hỗ trợ các hàm đơn giản với cú pháp C, COM cho phép bạn thực hiện một mô hình đối tượng. Lấy các lớp trong các không gian tên Microsoft.Office.Interop chẳng hạn, chúng là tất cả các lớp COM thuần túy không có trình bao bọc. Làm văn phòng interop với pinvoke sẽ được excruciatingly đau đớn.

Một vấn đề cốt lõi khác với pinvoke rằng nó thường là gánh nặng của lập trình viên khách để viết các khai báo. Người ít nhất có khả năng làm cho họ đúng. Một tác giả COM có thể xuất bản một thư viện kiểu được tạo tự động, giống như siêu dữ liệu trong một hội đồng .NET. Loại bỏ các tỷ lệ cược sai lầm và không có công việc cần thiết bởi lập trình viên khách hàng ngoài Dự án + Thêm tham chiếu.

Phát biểu đạn của bạn:

  • kiểm tra ra mã sẽ luôn luôn sử dụng đúng dll thay vì COM đăng ký cuối cùng
    Bạn vẫn còn chịu sự thay đổi bất thường của Windows tìm ra DLL thích hợp. Cách tốt nhất để tránh tai nạn là lưu trữ DLL trong cùng thư mục với EXE. Đó là hoàn toàn có thể trong COM là tốt, tất cả các bạn phải làm là tạo một file trống với tên yourapp.exe.local

  • Nhiều phiên bản có thể chạy song song trên các máy chủ (ví dụ: DEV, TEST và QA)
    không phải là một vấn đề trong COM hoặc, sử dụng các kỹ thuật nói trên hoặc bằng cách sử dụng một reg miễn manifest

  • không đăng ký COM rắc rối
    sử dụng một biểu hiện reg miễn phí nên không đăng ký là bắt buộc. Rất đơn giản để làm, chỉ cần đặt thuộc tính Isolated của tham chiếu là True.

  • Nhanh hơn chức năng COM giao tiếp (điều tôi đọc thấy một sự gia tăng tốc độ 30%)
    Đó là nhiều chậm hơn COM. Bạn có thể phải trả thêm chi phí bằng cách thực hiện các cuộc gọi COM trễ thông qua IDispatch, số tiền đó đắt như một cuộc gọi pinvoke.


Có một cách thứ ba để làm mã interop mẹ đẻ: viết một wrapper lớp quản lý bằng ngôn ngữ C++/CLI. Kỹ thuật này được sử dụng rất nhiều trong .NET framework, đặc biệt là trong mscorlib.dll, System.Data và PresentationFramework, các assembly có sự phụ thuộc mạnh vào mã nguồn gốc. Tuy nhiên không phải là rất thích hợp cho Delphi, nó hoạt động tốt nhất cho mã nguồn gốc có thể dễ dàng được gọi từ C hoặc C++.

+0

Câu trả lời hay. Tôi đã thử một bản kê khai miễn phí, nhưng không thể làm cho nó hoạt động, ít nhất không phải từ bên trong Visual studio (tài sản bị cô lập). Tôi không chắc làm thế nào "yourapp.exe.local" thay đổi hành vi của việc tìm kiếm COM chính xác? – Cohen

+0

Tôi không biết cách trả lời câu hỏi "nó không hoạt động". Tệp .local chỉ đơn giản là yêu cầu trình tải Windows chỉ tìm trong thư mục chứa EXE, bất kể đường dẫn được chỉ định trong khóa sổ đăng ký. Thô lỗ và không thay thế cho một biểu hiện, nhưng nó chắc chắn có thể được thuận tiện. –

+0

"'nó không hoạt động'-câu hỏi." Tôi hiểu. Tôi sẽ phải tìm hiểu thêm về tệp kê khai. Tôi không nghĩ rằng .Local sẽ là một giải pháp trong một môi trường asp.net. Các exe trong trường hợp này sẽ là quá trình công nhân IIS, nếu tôi không nhầm? – Cohen

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