2012-02-03 22 views
6

tôi có một dự án vb6 có tham chiếu đến một thư viện com vb.net.Lỗi thời gian chạy trễ ràng buộc trong VB6 khi tạo đối tượng từ một assembly .NET

dự án chạy tốt khi tôi sử dụng đầu ràng buộc như:

Dim b as object 
Set b = new myComLib.testObject 

khi tôi sử dụng cuối ràng buộc như:

Dim b as object 
Set b = CreateObject("myComLib.testObject") 

tôi nhận được lỗi sau:

Run-time error '429': ActiveX component can't create object

Bất kỳ ý tưởng nào?

nhờ

+0

Tôi chỉ cố gắng này và cả hai phương pháp làm việc. Tôi đang trên XP và tôi đã thêm myComLib.tlb làm tài liệu tham khảo cho dự án. Bạn đang sử dụng XP hoặc Win7? –

+0

tôi đang sử dụng xp. tôi đã đăng ký thư viện và cũng được sao chép vào thư mục dự án (cả tệp dll và tlb) tôi cũng đã thêm một tham chiếu đến dự án. Đó là lý do tại sao các công trình ràng buộc sớm. Sự ràng buộc muộn cũng nên làm việc. tôi cũng đã cố gắng để thêm một referense để scrrun.dll nhưng vẫn không có gì. – reven

Trả lời

5

Các mục đăng ký cho lớp NET COM Interop trong trường hợp này là: -

HKEY_CLASSES_ROOT\myComLib.testObject 

chứa một giá trị CLSID và mục CLSID tự

HKEY_CLASSES_ROOT\CLSID\<<myComLib.testObject\CLSID value>> 

Họ là cũng được sao chép trong

HKEY_LOCAL_MACHINE\SOFTWARE\Classes 

CreateObject sử dụng các mục HKEY_CLASSES_ROOT để lấy các chi tiết của tên lớp thông qua năm vì vậy nếu họ đang bỏ lỡ bạn sẽ nhận được

Run-time error '429': ActiveX component can't create object

Trong IDE VB6, thêm một tham chiếu đến các dll (trong trường hợp của một NET lắp ráp, thông qua nó là tập tin tlb) bỏ qua tìm kiếm đăng ký này do đó cho phép các ràng buộc sớm để làm việc mà không có các mục đăng ký COM.

Lớp học phải được đăng ký chính xác để CreateObject hoạt động. Điều này sẽ xảy ra như là một phần của quá trình xây dựng Visual Studio, nếu không nó cần phải được đăng ký bằng tay bằng cách sử dụng Regasm.

Bạn có thể kiểm tra hành vi này bằng cách thực hiện như sau: -

1) Tạo VB mới.NET myComLib dự án đăng ký COM Interop trong dự án Biên dịch tài sản và thêm một lớp TestObject

Public Class testObject 

    Public Property TestProperty As String 

    Public Function TestFunction() As String 
     Return "return" 
    End Function 

End Class 

2) Xây dựng myComLib

3) Tạo một dự án VB6 mới, thêm hai nút lệnh để Form1 và đoạn mã sau

Private Sub Command1_Click() 
    Dim b As Object 
    Set b = New myComLib.testObject 
    b.TestProperty = "Hello" 
    MsgBox b.TestProperty, vbOKOnly, b.TestFunction() 
End Sub 

Private Sub Command2_Click() 
    Dim b As Object 
    Set b = CreateObject("myComLib.testObject") 
    b.TestProperty = "Hello" 
    MsgBox b.TestProperty, vbOKOnly, b.TestFunction() 
End Sub 

4) Chạy dự án VB6 (không biên dịch đầy đủ như rằng sẽ thất bại)

Command2 sẽ bật lên một hộp thông báo, Bộ Tư lệnh 1 sẽ thất bại với

Compile Error: User-defined type not defined.

5) Dừng dự án và thêm một tham chiếu đến myComLib qua nó TLB tập tin

6) Chạy dự án VB6 và cả nút bây giờ sẽ làm việc

7) Đi vào registry và xóa các entry HKEY_CLASSES_ROOT \ myComLib.testObject (điều này có thể được tái tạo bởi Xây dựng lại các thành phần .NET, bạn sẽ cần phải đóng VB6 để thực hiện việc xây dựng lại)

Command2 bây giờ sẽ thất bại với

Run-time error '429': ActiveX component can't create object

cho đến khi mục nhập đăng ký được thêm lại.

+0

bạn đã viết HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ CLSID \ có tên khác với HKEY_CLASSES_ROOT. Tại sao chuyện này đang xảy ra? – reven

+0

Các mục đăng ký xảy ra trong cả HKEY_CLASSES_ROOT và HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ CLSID nhưng CreateObject sử dụng HKEY_CLASSES_ROOT. Vì tôi đã thực hiện tìm kiếm đăng ký từ HKEY_CLASSES_ROOT \ myComLib.testObject mục nhập tiếp theo trong sổ đăng ký là HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ CLSID. Tôi sẽ cập nhật câu trả lời. –

+0

trong trường hợp của tôi, createobject đang làm việc với HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ CLSID !!! – reven

0

Nếu bạn là thiết lập ClassInterfaceType.None, Bạn phải thêm thuộc tính ProgId vào lớp học của mình để cho phép ràng buộc muộn.

Ví dụ:

[Guid("B1E17DF6-9578-4D24-B578-9C70979E2F05")] 
public interface _Class1 
{ 
    [DispId(1)] 
    string TestingAMethod(); 
} 

[Guid("197A7A57-E59F-41C9-82C8-A2F051ABA53C")] 
[ProgId("Rubberduck.SourceControl.Class1")] 
[ClassInterface(ClassInterfaceType.None)] 
public class Class1 : _Class1 
{ 
    public string TestingAMethod() 
    { 
     return "Hello World"; 
    } 

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