Foros del Web » Programación para mayores de 30 ;) » .NET »

DLL hecha en C para usar en VB.net

Estas en el tema de DLL hecha en C para usar en VB.net en el foro de .NET en Foros del Web. Hola a todos. Tengo una DLL que acabo de compilar con Dev-C++. La misma está escrita en C. Quise añadirla a un proyecto de Visual ...
  #1 (permalink)  
Antiguo 28/11/2007, 10:03
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 1 mes
Puntos: 9
DLL hecha en C para usar en VB.net

Hola a todos. Tengo una DLL que acabo de compilar con Dev-C++. La misma está escrita en C. Quise añadirla a un proyecto de Visual Studio.Net 2003, desde el panel de objetos->referencias->agregar referencia y ahí le doy a examinar y agrego mi DLL a la lista. El problema es que cuando quiero agregarla al proyecto me da el siguiente error:

"Este no es un ensamblado va´lido o un componente COM. Sólo se puede hacer referencia a ensamblados con la extensión 'dll' y a componentes COM. Asegúrese que se tiene acceso al archivo y de que es un ensamblado o componente COM válido".

Lo que no entiendo es si justamente estoy tratando de agregar un ensamblado archivo con la extensión dll, porque me tira ese error.
Espero que alguien pueda ayudarme en esto.
Saludos!.
__________________
Add, never Remove
  #2 (permalink)  
Antiguo 28/11/2007, 10:26
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Re: DLL hecha en C para usar en VB.net

El hecho de que tu librería tenga extensión DLL no significa que sea un ensamblado para .NET. Si lo que desarrollaste con C no es un componente COM, entonces debes usar P/Invoke:
http://msdn2.microsoft.com/en-us/lib...04(vs.71).aspx
http://msdn.microsoft.com/msdnmag/issues/03/07/NET/

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #3 (permalink)  
Antiguo 28/11/2007, 19:07
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 1 mes
Puntos: 9
Re: DLL hecha en C para usar en VB.net

Gracias xknown. Pude solucionar el error inicial, pero ahora me surge otro, que no logro entender. Llevo horas tratando de comprender el por que, y no, no puedo. Tengo una función getBytes (es una de las que exporta la DLL), que cuando la ejecuto en .Net me dice "instancia de objeto no establecida a referencia de un objeto". Ese error tengo entendido que surge cuando no se crea un objeto de manera adecuada, pero en este caso, no estoy creando ningún objeto, tan solo estoy llamando a una función.
La signatura de la función es:
Código PHP:
typedef unsigned long BITDATATYPE;

void getBytes BITDATATYPE value ); 
En mi código .Net, la declaro primero de esta forma:
Código PHP:
<DllImport("mydll.dll")> _
    
Private Shared Sub getBytes(ByVal value As Long)
    
End Sub 
Y luego la llamo así getBytes ( 4525 ). Lo raro de esto es que si le paso el valor 0 como argumento, la función se ejecuta correctamente, no me devuelve ningún error. En cambio, si le paso cualquier otro valor, distinto de cero, me devuelve el error que mencioné arriba. Quizás se deba a una incompatibilidad de tipos de datos?.
Saludos!.
__________________
Add, never Remove
  #4 (permalink)  
Antiguo 29/11/2007, 08:39
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Re: DLL hecha en C para usar en VB.net

Sin código no puedo decir nada que te pueda ayudar. Intenta aislar el problema y comentas si encuentras algo raro.

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #5 (permalink)  
Antiguo 29/11/2007, 13:49
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 1 mes
Puntos: 9
Re: DLL hecha en C para usar en VB.net

No es más código que lo que puse anteriormente en .Net::

Código PHP:
<DllImport("mydll.dll")> _
    
Private Shared Sub HelloWorld()
    
End Sub
    
<DllImport("mydll.dll")> _
    
Private Shared Function Suma(ByVal value As IntegerByVal value2 As Integer) As Integer
    End 
Function
    <
DllImport("mydll.dll")> _
    
Private Shared Sub getBytes(ByVal value As Long)
    
End Sub


    
Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load

        getBytes
(1)

    
End Sub 
En C, esta es la implementación de la función getBytes:

Código PHP:
DLLIMPORT void getBytes BITDATATYPE value )
{
    
    
BITDATATYPE tmpvalue;
    
int leftshifts;
    
    
tmpvalue value;
    
leftshifts 0;
    
    while ( 
value != )
    {                
        while ( ( ( 
tmpvalue >> __BYTEBITS__ ) << __BYTEBITS__ ) != )
        {
            
tmpvalue >>= __BYTEBITS__;
            
leftshifts += 1;
        } 
        
push getByte tmpvalue ) );
        
rightShift ( (int*)&tmpvalue leftshifts );              
        
value = ( value ^ ( tmpvalue ) ) << __BYTEBITS__;
        
tmpvalue value;
        
leftshifts 0;         
    }    

En donde BITDATATYPE es un tipo de datos definido por mi, de tipo unsigned long; __BYTEBITS__ es una constante. Su valor es 8; rightShift es una función que desplaza un numero de posiciones (2do. parametro) hacia la derecha a un valor (1er parametro).
Saludos!.
__________________
Add, never Remove
  #6 (permalink)  
Antiguo 29/11/2007, 15:41
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Re: DLL hecha en C para usar en VB.net

Hice un programa muy básico y no obtengo ningún error, lo que me lleva a recordarte que primero debes aislar el problema, puesto que poco puedo aportar yo si no tengo acceso al código (si colgarías algún ejemplo donde se pueda reproducir ese error, posiblemente te ayude más*).

Saludos

* No tengo tiempo para completar las porciones de código que pones.
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #7 (permalink)  
Antiguo 29/11/2007, 17:53
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 1 mes
Puntos: 9
Re: DLL hecha en C para usar en VB.net

Gracias por responder xknown. El código .Net es el que puse arriba. No tengo más que eso. Lo único que hago es llamar a getBytes, y ahí me devuelve el error. No creo que quieras ver el código que tengo en C no?, porque no corresponde a este foro. Si es así, si viendo el código en C, me puede hechar una mano con esto, estaría muy agradecido. No tienes más que decirmelo y te lo paso por un MP.
Gracias de nuevo xknown.
Saludos.
__________________
Add, never Remove
  #8 (permalink)  
Antiguo 29/11/2007, 20:17
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Re: DLL hecha en C para usar en VB.net

En mi opinión no hay nada raro en el código hecho en .NET (talvez la forma como defines a las funciones de tu librería en VB.NET).

Sobre el código en C, mis conocimientos de este lenguaje son muy básicos, pero si deseas envíame el código (sólo la parte relevante -- obviamente funcional) y la dll compilada.

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:48.