2013-01-09 11 views
28

Tôi đang làm việc trên một sản phẩm hiển thị một số API .NET thông qua COM interop. Là một phần của bản dựng, chúng tôi tạo các tệp * .tlb cho tất cả các hội đồng đó và phân phối chúng như một phần của gói SDK riêng biệt. Khách hàng của chúng tôi có thể cài đặt SDK trên đầu sản phẩm của chúng tôi và tạo các ứng dụng sử dụng API COM của chúng tôi.Tệp * .tlb có được sử dụng khi chạy không?

Chúng tôi có cần gửi và đăng ký các tệp * .tlb đó với chính sản phẩm không? Có tình huống khi * .tlb được yêu cầu khi chạy, khi các thư viện của bên thứ ba được mã hóa với chúng được thực thi không?

Vui lòng giải thích cách hoạt động, nếu bạn trả lời Có. Tôi thấy rất nhiều ý kiến ​​trên internet nói rằng tôi phải giao và đăng ký chúng, nhưng tôi không tìm thấy một giải thích rõ ràng tại sao nó nên được thực hiện. Điều đó làm tôi nghi ngờ rằng điều đó là sự thật.

Trả lời

28

Có, điều đó là có thể. Đặc biệt trong trường hợp .NET, bạn không nên bỏ qua việc đăng ký thư viện kiểu vì bạn không thể dự đoán được mã máy khách sẽ sử dụng máy chủ của bạn như thế nào.

Họ không phải là đặc biệt phổ biến nhưng có hai trường hợp:

  • Khi mã khách hàng gọi của bạn [ComVisible] phương pháp và cuộc gọi đi qua một ranh giới căn hộ. Căn hộ là một khái niệm COM hơi mờ, bạn phải hiểu sự khác biệt giữa các chủ đề STA và MTA. Giữ nó đơn giản: một ranh giới căn hộ thường được vượt qua khi cuộc gọi được thực hiện từ một chủ đề khác, từ một quá trình khác hoặc từ một máy khác. COM cần giúp đỡ để tìm ra cách sắp xếp các đối số của cuộc gọi vào một gói IPC và yêu cầu phải biết loại đối số. Không có khái niệm Reflection trong COM nên nó không thể dễ dàng được thực hiện tự động. Một DLL riêng biệt được yêu cầu để thực hiện proxy và stub, hầu như luôn luôn được tạo ra từ một tệp IDL. Đó là khó khăn để đi qua trong. NET, bạn hầu như luôn luôn sử dụng cách thứ hai thuận tiện, bằng cách sử dụng marshaller tiêu chuẩn được xây dựng trong Windows. Trong đó sử dụng một loại thư viện để tìm ra những loại đối số được. Tùy chọn Regasm.exe/tlb đảm bảo rằng thư viện proxy/stub và kiểu giao diện được đăng ký để trình marshaller chuẩn có thể tìm thấy thư viện.

  • Khi bạn vạch trần cấu trúc trong giao diện công khai của mình. Structs là rất phiền hà trong các tình huống interop, họ có một bố cục phụ thuộc nhiều vào các thiết lập trình biên dịch. Thuộc tính .NET tương đương là StructLayout.Pack. Đã sửa lỗi ở mức 8 trong .NET nhưng mã máy khách không biết điều đó. Để truy cập một cấu trúc, mã máy khách phải sử dụng IRecordInfo. Cho phép nó tìm ra nơi mọi lĩnh vực của cấu trúc nằm trong bộ nhớ. Một thư viện kiểu cung cấp thông tin mà IRecordInfo cần. Nó chắc chắn là tốt nhất để tránh các cấu trúc hoàn toàn và rất dễ thực hiện trong .NET.

+0

Cảm ơn bạn đó là những gì tôi đang tìm kiếm. – Dennis

+1

Tài liệu của Microsoft xác nhận nó: http://msdn.microsoft.com/en-us/library/eaw10et3.aspx#marshaling_and_com_apartments “Chấp nhận chi phí của marshaling chéo căn hộ, đáng chú ý chỉ khi có nhiều cuộc gọi qua ranh giới. Bạn phải đăng ký thư viện kiểu của thành phần COM cho các cuộc gọi để vượt qua thành công ranh giới căn hộ. ” – Dennis

+1

http://msdn.microsoft.com/en-us/library/windows/desktop/ms692621(v=vs.85).aspx "Một thay thế cho việc sử dụng MIDL để tạo proxy và khai báo cho các giao diện tùy chỉnh, một thư viện kiểu có thể được tạo ra và hệ thống được cung cấp, công cụ marshaling kiểu thư viện sẽ sắp xếp giao diện." – Dennis

0

tôi đã phải đối mặt với một vấn đề trong khi đăng ký dll Net được sử dụng trong thành phần COM như .tlb tài liệu tham khảo.

Vì vậy, bạn không cần đăng ký .Net dll (dự án .tlb).

Tôi hy vọng nó sẽ hoạt động.