2013-08-16 50 views
6

Tôi đã viết một dự án .NET đơn giản (Thư viện lớp) là COM hiển thị. Nó hoạt động với VB6!Sử dụng ClassInterfaceType.AutoDual thực sự là một ý tưởng tồi, ngay cả với VB6?

Mã này trông giống như sau:

[ComVisible(true)] 
[ClassInterface(ClassInterfaceType::AutoDual)] 
public ref class MyObject 
{ 
    // Some methods and values 
} 

Việc lắp ráp được ký chính xác (không yêu cầu nếu nó không nằm trong GAC) và đăng ký (regasm MyProject.dll /tlb /codebase).

Sau đó, tệp TLB được tham chiếu trong dự án VB6 của tôi và tất cả đều OK! Tôi có thể truy cập vào các lớp học của tôi và các phương pháp công cộng bên trong chúng.

Trên Internet, nhiều người nói rằng việc sử dụng ClassInterfaceType::AutoDual không phải là một ý tưởng hay, vì các vấn đề tiềm năng xảy ra với phiên bản có thể phá vỡ các ứng dụng sử dụng lắp ráp.

Nhưng, trong trường hợp của tôi, nó thực sự là một vấn đề? Hội đồng này chỉ được sử dụng trong các dự án VB6 (trong phần kết nối sớm).

Trong mỗi bản phát hành mới, tôi thực hiện lại các bước này (đã ký, đã đăng ký, v.v.). Nó có thể là bất kỳ vấn đề versioning với giải pháp này?

Dù sao, tôi có thể viết một số thuộc tính [GUID("...")] không?

GUID được tạo tự động bởi Visual Studio, vì vậy các lớp không phải là GUID giống nhau ở mỗi lần biên dịch. Đúng không?

Trả lời

11

Ràng buộc sớm trong VB6 không thể hoạt động nếu bạn không sử dụng Tự động. Ngoài ra, tự động hoàn thành không còn hoạt động trong trình chỉnh sửa VB6, do đó, nguy cơ nhập sai lầm gây ra lỗi thời gian chạy cao hơn. VB6 lập trình có xu hướng được sử dụng để điều này vì vậy cũng có thể nhấn mạnh vào nó.

Chắc chắn, điều đó rất nguy hiểm. Nếu bạn cập nhật máy chủ COM và phạm sai lầm khi chỉ định [Hướng dẫn] và không cập nhật thì có nguy cơ đáng kể là chương trình VB6 sẽ bị lỗi khi chạy với lỗi hoàn toàn không thể đoán trước. Hay tệ hơn, không phải là tai nạn chút nào, nhưng hãy gọi phương pháp hoàn toàn sai.

Nếu bạn cho phép. NET tự động tạo [Hướng dẫn], rất khuyến khích, thì bạn không gặp phải sự cố nghiêm trọng nhưng lỗi "thành phần ActiveX không thể tạo đối tượng" khi chạy. Đó là một chút hữu ích hơn và chắc chắn ít nguy hiểm nhưng cung cấp cho bạn hoặc người sử dụng rất ít hướng dẫn về nơi để tìm kiếm vấn đề.

Nếu bạn sử dụng ComInterfaceType.InterfaceIsIDispatch thì trình lập trình VB6 buộc phải sử dụng kết buộc trễ và sử dụng GetObject() để tạo đối tượng. [Hướng dẫn] không quan trọng nhiều nữa và có tỷ lệ cược cao hơn mà mã VB6 hiện tại vẫn có thể sử dụng máy chủ COM nếu thay đổi không quá cấp tiến. Nó vẫn còn bom nếu, nói, một phương pháp có được một đối số thêm. Sẽ có một lỗi thời gian chạy tốt hơn cho nó. Không phải là một cách chữa trị cho một sự thay đổi trong logic của phương pháp mà lập trình viên VB6 không tính vào dĩ nhiên. Một bất lợi là một cuộc gọi phương thức sẽ chậm hơn đáng kể.

+0

Cảm ơn bạn đã trả lời! Để làm rõ, trong dự án, các mục tiêu là: 1) Sử dụng Intellisense trong VB6 2) Sử dụng các đối tượng như thế này: 'Dim myobj As New MyObject'. Sau đó, giải pháp của tôi là tốt, phải không? –

+2

Tôi đã đề cập đến điều đó trong câu trả lời của mình, tự động hoàn thành cũng giống như IntelliSense và bạn không muốn sử dụng GetObject. Rõ ràng bạn nhấn mạnh vào việc sử dụng AutoDual. –

+0

Rất cám ơn! Tóm lại, nếu tôi gỡ bỏ cài đặt và cài đặt lại assembly đúng cách (với 'regasm'), thì chúng sẽ không có vấn đề gì với phiên bản ngay cả khi tôi sử dụng GUID tự động và AutoDual. Làm thế nào về DispID? –