2012-02-03 16 views
6

tengo un proyecto vb6 que hace referencia a una biblioteca vb.net com.Error de tiempo de ejecución vinculante en VB6 al crear un objeto desde un ensamblado .NET

el proyecto funciona bien cuando uso temprano de unión, tales como:

Dim b as object 
Set b = new myComLib.testObject 

cuando utilizo la ligadura tales como:

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

me sale el siguiente error:

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

¿Alguna idea?

gracias

+0

acabo intentado esto y ambos métodos de trabajo. Estoy en XP y agregué myComLib.tlb como referencia al proyecto. ¿Estás en XP o Win7? –

+0

estoy usando xp. He registrado la biblioteca y también he copiado en la carpeta del proyecto (archivo dll y tlb). También he agregado una referencia al proyecto. Es por eso que el enlace temprano funciona. La vinculación tardía también debería funcionar. También intenté agregar un referencia a scrrun.dll pero aún nada. – reven

Respuesta

5

Las entradas del registro para la clase de .NET de interoperabilidad COM en este caso son: -

HKEY_CLASSES_ROOT\myComLib.testObject 

que contiene un valor CLSID y la entrada CLSID sí

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

Son también replicado en

HKEY_LOCAL_MACHINE\SOFTWARE\Classes 

CreateObject utiliza las entradas HKEY_CLASSES_ROOT para recuperar los detalles del nombre de la clase aprobada en lo que si que se pierden recibirá

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

dentro del IDE de VB6, añadir una referencia a la DLL (en el caso de una El ensamblado .NET, a través de su archivo tlb) pasa por alto esta búsqueda de registro, lo que permite que el enlace anticipado funcione sin las entradas de registro COM.

La clase debe registrarse correctamente para que CreateObject funcione. Esto debería ocurrir como parte del proceso de compilación de Visual Studio; de lo contrario, debe registrarse manualmente usando Regasm.

Esto se comprueba el comportamiento de la siguiente manera: -

1) Crear un nuevo VB.myComLib NET registrarse para interoperabilidad COM en el proyecto Compilar propiedades y añadir una clase testObject

Public Class testObject 

    Public Property TestProperty As String 

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

End Class 

2) Construir myComLib

3) Crear un nuevo proyecto de Visual Basic 6, agregue dos botones de comando a Form1 y el siguiente código

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) Ejecutar el proyecto de VB6 (sin compilación completa como que se producirá un error)

Comando2 emergerá un cuadro de mensaje, Comando 1 fallará con

Compile Error: User-defined type not defined.

5) Detener el proyecto y agregar una referencia a myComLib a través de su TLB archivo

6) Ejecutar el proyecto de VB6 y los dos botones debería funcionar

7) Id por el registro y borrar el registro HKEY_CLASSES_ROOT \ myComLib.testObject (esto se puede volver a crear mediante la reconstrucción del componente .NET, tendrá que cerrar VB6 para llevar a cabo la reconstrucción)

Comando2 ahora fallará con

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

hasta que se vuelva a agregar la entrada del registro.

+0

tiene que escribir el HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ CLSID \ tiene un nombre diferente que HKEY_CLASSES_ROOT. ¿Por qué está pasando esto? – reven

+0

Las entradas del registro se producen en HKEY_CLASSES_ROOT y HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ CLSID, pero CreateObject utiliza HKEY_CLASSES_ROOT. Debido a que hice una búsqueda de registro de HKEY_CLASSES_ROOT \ myComLib.testObject, la siguiente entrada en el registro es HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ CLSID. Actualizaré la respuesta. –

+0

en mi caso el createobject está trabajando con HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ CLSID !!! – reven

0

Si tiene la configuración ClassInterfaceType.None, tiene que agregar un atributo ProgId a su clase para permitir el enlace tardío.

Por ejemplo:

[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"; 
    } 

} 
Cuestiones relacionadas