2012-10-10 26 views
5

Tôi cần phải kết buộc muộn với đối tượng COM VB6 bên thứ 3 trong ứng dụng 3,5 C# (để tránh các phụ thuộc phiên bản mà chúng tôi hiện có). Các dll được cung cấp không phải là tiêu hao trong hầu hết các cách không muộn do một số lỗi gây ra lỗi khi chúng ta cố gắng tiêu thụ nó bình thường. Hiện nay, chúng tôi đang sử dụng một wrapper VB6 tùy chỉnh mà làm cho mọi thứ VERY phiên bản cụ thể, tuy nhiên tôi đã tìm thấy rằng tôi có thể sử dụng cuối ràng buộc để truy cập tài sản và phương pháp. Bây giờ, tôi đang cố gắng để kết thúc muộn với các sự kiện, tuy nhiên tất cả mọi thứ tôi đã đọc nói rằng tôi cần phải kế thừa từ giao diện của trình bao bọc COM để tạo ra các bồn sự kiện cần thiết. Here is one such article.Làm thế nào để kết thúc sự kiện COM không có giao diện

Vì vậy, câu hỏi của tôi là liệu có thể thực hiện xử lý sự kiện bị ràng buộc trễ mà không có bất kỳ tham chiếu đến dll nào tại thời gian biên dịch không?

CẬP NHẬT

Dưới đây là những sai lầm tôi có với các wrapper VB6 (nào vẫn đang được cập nhật tích cực).

  • Trong OleViewer, tôi nhận được

Không thể dịch ngược mục được chọn Lỗi tải loại thư viện/DLL. TYPE_E_CANTLOADLIBRARY ($ 80029C4A)

  • Trong Visual Studio tôi nhận được:

Không thể xác định sự phụ thuộc của tham chiếu COM "3rdPartyDLL". Lỗi khi tải thư viện kiểu/DLL. (Ngoại lệ từ HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY))

+0

Tôi tò mò: các lỗi mà bạn thấy khi bạn cố gắng sử dụng đối tượng VB6 của bạn theo những cách bị ràng buộc sớm là gì? Tôi đã viết nhiều thành phần COM VB6 và chưa bao giờ có bất kỳ vấn đề với việc sử dụng bất kỳ của chúng trong bất kỳ môi trường khác (miễn là khách hàng hỗ trợ COM). Tại sao bạn thậm chí còn quan tâm đến việc phiên bản cho một thành phần VB6 - nó có được phát triển tích cực bởi tác giả của nó không? – xxbbcc

+0

@xxbbcc Nó vẫn đang tích cực được phát triển và tôi cập nhật để hiển thị các lỗi –

+1

@WhozCraig: VB6 sự kiện luôn là IDispatch chỉ dựa. – wqw

Trả lời

0

Vấn đề có thể là do nền tảng bạn đang sử dụng. Tôi vừa có một vấn đề tương tự ngày hôm qua. Đảm bảo rằng bạn đang đặt nền tảng dự án của mình thành x86/x64 khi bạn kết thúc muộn thư viện kiểu kết hợp x86/x64.

Điều tương tự cũng áp dụng cho oleview. Sử dụng phiên bản x86/x64 để xem các thư viện kiểu x86/x64. (Có thể bạn cần cài đặt Windows SDK x64 nếu bạn đang sử dụng hệ thống x64 để có thể thực thi đúng).

0

Từ here:

tôi thấy rằng vấn đề xảy ra khi IDL chứa một importlib để typelib .tlb của một dự án khác.

Điều này dường như tạo ra sự phụ thuộc giữa một dll và khác.

Nếu thiếu phụ thuộc OLEView từ chối hiển thị phụ thuộc dll, cũng tự thể hiện bằng cách không cho phép #import từ mã C++ .

Vì vậy, tôi sẽ xem xét kỹ các phụ thuộc COM của DLL được đề cập và đảm bảo tất cả chúng đều được đăng ký.

Nó cũng tiếp tục thêm:

... vì cả hai dlls là đồng phụ thuộc, thành phần từ mỗi tương tác (thông qua tờ khai giao diện trên phương pháp chữ ký) và sử dụng #import từ mỗi khác TypeLib.

Do đó, trừ khi cả hai dll mục tiêu đều có mặt, không thể được tạo lại. Như bạn có thể tưởng tượng, điều này gây ra một vấn đề khủng khiếp khi bạn cố gắng xây dựng lại hoàn toàn dự án từ đầu.

Tôi đã thử nghiệm tách các định nghĩa giao diện vào nhỏ file IDL ...


Edit: đây là một ví dụ gần đây về vấn đề này đến khoảng (Tôi tin). Tôi đã xuất thư viện C# sang COM. Sửa đổi thư viện đó đã được thực hiện mà thay đổi giao diện của một số lớp học, nhưng GUID thư viện đã không thay đổi. Ngoài ra see here about risks of AutoDual đã được sử dụng.

Đây là phần lẻ - DLL VB6 được xây dựng lại tham chiếu đến C# DLL đã sửa đổi. Nó được biên dịch tốt. không có lỗi. Nhưng typelib của nó đã bị hỏng - OleView không thể mở nó, thất bại với TYPE_E_CANTLOADLIBRARY. Thay đổi C# DLL GUID là cần thiết để có được DLL VB6 biên dịch lại thành công.

Rõ ràng là một cạm bẫy của VB6/C# interop.

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