2009-11-03 47 views
46

Tôi cần làm rõ một số. Tôi có một dll Reportwriter sử dụng Crystal Reports. Nó được viết bằng VB6. Tôi phải thêm dll này vào dự án asp.net của tôi, nơi nó tạo ra một dll interop.Dll interop là gì?

Theo sự hiểu biết của tôi, dll interop có một trung gian để mã .net của tôi có thể nói với dll của nhà báo.

Vì vậy, tôi có đăng ký dll interop hoặc tôi có đăng ký dll gốc không?

+0

+1 Tôi nghĩ đó là một câu hỏi hay ngay cả khi không ai khác bỏ phiếu cho bạn. :) – Dusty

Trả lời

85

Khi bạn viết mã trong VB6, kết quả được biên dịch là thành phần COM. Các thành phần COM cung cấp các giao diện, coclasses, structs và enums, thường được mô tả bằng cách sử dụng thư viện kiểu COM. Tuy nhiên, để tiêu thụ thành phần COM đó trong .NET, bạn cần mô tả kiểu theo định dạng .NET hiểu - đó là, một assembly .NET (vì nó không thể làm việc trực tiếp với các thư viện kiểu). Do đó, một hội đồng interop chỉ là một thư viện kiểu COM "được chuyển đổi", theo nghĩa là nó chứa các mô tả về các giao diện, các cấu trúc vv tương ứng với cùng một thứ trong một thư viện kiểu.

(Ở trên là hơi đơn giản, như Interop Assembly không đã được sản xuất từ ​​một thư viện kiểu - bạn có thể trao mã một nếu bạn muốn, ví dụ.)

Trái với những gì là thường nói, một lắp ráp interop không chứa bất kỳ mã thực thi nào, và nó không làm bất kỳ sự sắp xếp nào. Nó chỉ chứa các định nghĩa kiểu, và là nơi duy nhất mà nó có thể có các phương thức nằm trong các giao diện và các phương thức trong các giao diện không có thực hiện. Các cuộc gọi .NET đến các COM thực sự được thực hiện bởi chính CLR dựa trên các mô tả kiểu được nạp từ các hội đồng interop - nó tạo ra tất cả các mã cần thiết khi đang bay.

Bây giờ là câu hỏi của bạn. Bạn cần phải đăng ký dự án COM DLL (đầu ra của VB6) của bạn - ví dụ, sử dụng regsvr32.exe. Bạn không nên (trong thực tế, bạn không thể) đăng ký một hội đồng interop theo cách đó, bởi vì nó không phải là một thành phần COM - nó chỉ là một đồng bằng. NET lắp ráp, vì vậy bạn có thể đặt nó trong cùng một thư mục với .exe/.dll của bạn hoặc đặt nó vào GAC, như thường lệ.

+0

Vì vậy, làm thế nào để interop biết nơi dll báo cáo tồn tại, khi tôi thực hiện cuộc gọi đến phương pháp của nó từ mã NET của tôi. Liệu interop dịch một khóa trong registry? –

+1

Khi bạn đăng ký thành phần COM của bạn, vị trí của nó được ghi lại trong sổ đăng ký và có thể được truy xuất từ ​​đó nếu GUID của thành phần được biết. Interop lắp ráp biết GUID cho typelib mà từ đó nó được tạo ra, và GUID cho tất cả các loại trong typelib đó - chúng được lưu trữ dưới dạng các thuộc tính .NET. Thời gian chạy sau đó sẽ sử dụng thông tin này để giải quyết thành phần COM thông qua đăng ký. –

2

Bạn chính xác. Các interop DLL kết thúc tốt đẹp các cuộc gọi đến thành phần VB6 và làm cho chúng minh bạch.

Khi đăng ký các tệp DLL trên máy bạn sẽ thực thi ứng dụng, bạn vẫn phải đăng ký DLL VB6. Các interop DLL sẽ ngồi thư mục bin của ứng dụng của bạn và Marshal các cuộc gọi ra.

2

Bạn nên đăng ký dll VB6 của bạn và tham khảo nó trong dự án .NET của bạn; tham chiếu đó sẽ tạo ra Interop.dll

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