Dll (C#) en VB6

07/01/2008 - 10:20 por Gonzalo Rodríguez Carrera | Informe spam
Hola a todos.

Ya se que es un poco raro, pero me han pedido en la empresa que
investigue esta posibilidad, ya que tenemos un macro-programa (vamos
un programa enorme) en VB6 y la posibilidad de ir "sustituyendo"
partes de este programa por Dll's ya hechas en .NET nos puede ahorrar
trabajo en futuro... ya que iriamos migrando a los pocos la
aplicación.

Así que. ¿Se pueden usar librerías creadas en .NET en VB6?

Yo lo he intentado, pero no me aparecen en referencias (de VB6) y
cuando intento registrar una dll creada en .NET con el regsrv32 me
dice que se descarga el objeto pero no se puede registrar ya que no
hay punto de entrada.. así que no se muy bien por donde tirar...

Un while(true) de gracias a todos.

Gonzalo Rodríguez
Vigo - España

Preguntas similare

Leer las respuestas

#1 Octavio Hernandez
07/01/2008 - 11:48 | Informe spam
Gonzalo,

No debería haber problemas para interoperar.
Probablemente te falta poner el atribute ComVisible(true), que hace que
visible a COM el contenido de un ensamblado .NET.
Lo más fácil es ponerlo a nivel de ensamblado en AssemblyInfo.cs.

Slds - Octavio


"Gonzalo Rodríguez Carrera" wrote in message
news:
Hola a todos.

Ya se que es un poco raro, pero me han pedido en la empresa que
investigue esta posibilidad, ya que tenemos un macro-programa (vamos
un programa enorme) en VB6 y la posibilidad de ir "sustituyendo"
partes de este programa por Dll's ya hechas en .NET nos puede ahorrar
trabajo en futuro... ya que iriamos migrando a los pocos la
aplicación.

Así que. ¿Se pueden usar librerías creadas en .NET en VB6?

Yo lo he intentado, pero no me aparecen en referencias (de VB6) y
cuando intento registrar una dll creada en .NET con el regsrv32 me
dice que se descarga el objeto pero no se puede registrar ya que no
hay punto de entrada.. así que no se muy bien por donde tirar...

Un while(true) de gracias a todos.

Gonzalo Rodríguez
Vigo - España
Respuesta Responder a este mensaje
#2 Guillermo guille
07/01/2008 - 12:10 | Informe spam
Échale un vistazo a estos tres artículos:
http://www.elguille.info/NET/servid...araCOM.htm

Y aquí tienes un resumen de todo lo dicho y que si sigues los pasos, podrás
crear componentes de .NET totalmente compatibles con VB6:
http://www.elguille.info/NET/servid...de_VB6.htm

Nos vemos
Guillermo

Microsoft MVP Visual Basic desde 1997
Tus consultas en los foros del Guille: http://foros.elguille.info/


"Gonzalo Rodríguez Carrera" wrote in message
news:
Hola a todos.

Ya se que es un poco raro, pero me han pedido en la empresa que
investigue esta posibilidad, ya que tenemos un macro-programa (vamos
un programa enorme) en VB6 y la posibilidad de ir "sustituyendo"
partes de este programa por Dll's ya hechas en .NET nos puede ahorrar
trabajo en futuro... ya que iriamos migrando a los pocos la
aplicación.

Así que. ¿Se pueden usar librerías creadas en .NET en VB6?

Yo lo he intentado, pero no me aparecen en referencias (de VB6) y
cuando intento registrar una dll creada en .NET con el regsrv32 me
dice que se descarga el objeto pero no se puede registrar ya que no
hay punto de entrada.. así que no se muy bien por donde tirar...

Un while(true) de gracias a todos.

Gonzalo Rodríguez
Vigo - España
Respuesta Responder a este mensaje
#3 Gonzalo Rodríguez Carrera
07/01/2008 - 13:39 | Informe spam
Hola. Gracias antes de nada por vuestra pronta respuesta.

He creado la clase de pruebas, le puse un método, y todas esas cosas.
después, he compilado la dll, la paso con el regasm para crear el tlb
y copio despues la libreria al directorio Assembies dentro de Windows.

Me voy a VB6, referencias, y voilà... ahí esta mi librería. Vamos al
examinador de objetos, efectivamente, mí método esta alli.
... todo muy bien, pero cuando lo voy a probar... crash! "Esta clase
no admite automatización o no admite la interfaz esperada." ¡Mi gozo
en un pozo!... en fin, ¿os dejo el código y si podeis me decis que
falla? Yo mientras tanto seguiré viendo a ver...

/////// ASSEMBLYINFO.cs /////////
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[assembly: AssemblyTitle("COM")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany(".")]
[assembly: AssemblyProduct("COM")]
[assembly: AssemblyCopyright("© . 2008")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

[assembly: ClassInterface(ClassInterfaceType.AutoDispatch)]
[assembly: AssemblyKeyFileAttribute(@"E:\Zalo\desarrollo\C#\COM\COM\bin
\Debug\COM.snk")]

[assembly: ComVisible(true)]

[assembly: Guid("0c7bf8ec-16ac-4ad6-9fd6-ec086d46e614")]

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


///// CLASE //////////////

public class Class1
{
public Class1()
{ }

public interface ClaseCOM
{
int Suma(int Numero1, int Numero2);
}

public int Suma(int param1, int param2)
{
return param1 + param2;
}
}



Otro while(true) de gracias.

Gonzalo Rodríguez Carrera
Vigo - España
Respuesta Responder a este mensaje
#4 Guillermo guille
07/01/2008 - 14:48 | Informe spam
a mi con el AutoDispatch no me ha funcionado nunca bien... al menos si
quiero mantener la compatibilidad binaria (algo que siempre hago).

En cuanto a la interfaz... yo la pondría fuera de la clase... a lo mejor es
lo mismo, pero me imagino que para acceder a ella necesitará un "path" más
largo y no se si el COM se llevará bien con eso...

También sería conveniente que pusieras el código que usas en VB6 para
declarar la clase esa de .NET

Aunque te recomiendo que te leas lo que comento en esos links que te he
puesto y bajes los proyectos de prueba, a ver si te funcionan...

Nos vemos
Guillermo

Microsoft MVP Visual Basic desde 1997
Tus consultas en los foros del Guille: http://foros.elguille.info/


"Gonzalo Rodríguez Carrera" wrote in message
news:
Hola. Gracias antes de nada por vuestra pronta respuesta.

He creado la clase de pruebas, le puse un método, y todas esas cosas.
después, he compilado la dll, la paso con el regasm para crear el tlb
y copio despues la libreria al directorio Assembies dentro de Windows.

Me voy a VB6, referencias, y voilà... ahí esta mi librería. Vamos al
examinador de objetos, efectivamente, mí método esta alli.
... todo muy bien, pero cuando lo voy a probar... crash! "Esta clase
no admite automatización o no admite la interfaz esperada." ¡Mi gozo
en un pozo!... en fin, ¿os dejo el código y si podeis me decis que
falla? Yo mientras tanto seguiré viendo a ver...

/////// ASSEMBLYINFO.cs /////////
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[assembly: AssemblyTitle("COM")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany(".")]
[assembly: AssemblyProduct("COM")]
[assembly: AssemblyCopyright("© . 2008")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

[assembly: ClassInterface(ClassInterfaceType.AutoDispatch)]
[assembly: AssemblyKeyFileAttribute(@"E:\Zalo\desarrollo\C#\COM\COM\bin
\Debug\COM.snk")]

[assembly: ComVisible(true)]

[assembly: Guid("0c7bf8ec-16ac-4ad6-9fd6-ec086d46e614")]

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


///// CLASE //////////////

public class Class1
{
public Class1()
{ }

public interface ClaseCOM
{
int Suma(int Numero1, int Numero2);
}

public int Suma(int param1, int param2)
{
return param1 + param2;
}
}



Otro while(true) de gracias.

Gonzalo Rodríguez Carrera
Vigo - España
Respuesta Responder a este mensaje
#5 Gonzalo Rodríguez Carrera
07/01/2008 - 16:10 | Informe spam
Gracias Guille.

Ya le he dado un vistazo a los enlaces que me pusiste (no hubiera
llegado hasta aqui de lo contrario... :D )
Probaré entonces a cambiar lo del AutoDispatch, y lo de cambiar la
interfaz de sitio... a ver que tal.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida