• Jueves 28 de Marzo de 2024, 09:02

Autor Tema:  Dll De C++ En C#  (Leído 9294 veces)

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Dll De C++ En C#
« en: Lunes 26 de Marzo de 2007, 23:34 »
0
Hola estimados.

Saben, debo agregar una dll compilada para C++ en una aplicacion de windows desarrollada en C#, no logro hacerlo, no me deja a través de rerferencias, solo como objeto externo.

La opcion que vi, fue la siguiente (ejemplo):

[DllImport("Ladll.dll", EntryPoint="MoveFileW",  SetLastError=true,
CharSet=CharSet.Unicode, ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)]
public static extern bool MoveFile(String src, String dst);

El problema mayor es que nose las funciones que posee dicha dll para poder utilizarla.

Espero su ayuda.

Nota: Debo acceder a una funcion de dicha dll, pero tengo el nombre, pero nose tampoco como agregar la funcion en c#.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Dll De C++ En C#
« Respuesta #1 en: Martes 27 de Marzo de 2007, 01:06 »
0
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Dll De C++ En C#
« Respuesta #2 en: Martes 27 de Marzo de 2007, 15:16 »
0
No, si tengo los .h y .lib de esa DLL, lo que pasa es que nose hacer DLL y la tengo compilada solo para C++...

Si me puedes ayudar sería genial.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Dll De C++ En C#
« Respuesta #3 en: Martes 27 de Marzo de 2007, 15:21 »
0
entonces no entiendo que es lo que quieres...

reescribir esa dll en C# o usarla desde C#?

para usarla desde C# es tal como lo has hecho
Código: Text
  1. [DllImport("Ladll.dll", EntryPoint="MoveFileW", SetLastError=true,
  2. CharSet=CharSet.Unicode, ExactSpelling=true,
  3. CallingConvention=CallingConvention.StdCall)]...
  4. ...
  5.  

y los nombres de las funciones que puedes usar estan en el .h
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Dll De C++ En C#
« Respuesta #4 en: Martes 27 de Marzo de 2007, 15:46 »
0
Es que hay tipos propios o metodos con tipos declarados enla misma interfaz,  como puedo llamarlos?.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Dll De C++ En C#
« Respuesta #5 en: Martes 27 de Marzo de 2007, 15:54 »
0
debes declararlo en C# de nuevo, asi:

bueno este es un ejemplo que importa funciones, declara tipos y los usa.
Código: Text
  1.  
  2.  
  3.       [StructLayout(LayoutKind.Sequential)]
  4.         struct COORD
  5.       {
  6.         public short x;
  7.         public short y;
  8.       }
  9.  
  10.       [StructLayout(LayoutKind.Sequential)]
  11.         struct  CONSOLE_SCREEN_BUFFER_INFO
  12.       {
  13.         public COORD dwSize;
  14.         public COORD dwCursorPosition;
  15.         public int wAttributes;
  16.         public SMALL_RECT srWindow;
  17.         public COORD dwMaximumWindowSize;
  18.       }
  19.  
  20.       private readonly IntPtr STD_OUTPUT_HANDLE  = new IntPtr(-11);
  21.       private const byte EMPTY = 32;
  22.       private IntPtr hConsoleHandle;
  23.       private _CONSOLE_CURSOR_INFO normalCursor, nuevoCursor;
  24.  
  25.       [DllImport("kernel32.dll", EntryPoint="FillConsoleOutputCharacter", SetLastError=true, CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
  26.       private static extern int FillConsoleOutputCharacter(IntPtr hConsoleOutput, byte cCharacter, int nLength, COORD dwWriteCoord, ref int lpNumberOfCharsWritten);
  27.  
  28.       [DllImport("kernel32.dll", EntryPoint="SetConsoleCursorPosition", SetLastError=true, CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
  29.       private static extern int SetConsoleCursorPosition(IntPtr hConsoleOutput, COORD dwCursorPosition);
  30.  
  31.  
  32.       [DllImport("kernel32.dll", EntryPoint="GetConsoleScreenBufferInfo", SetLastError=true, CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
  33.       private static extern int GetConsoleScreenBufferInfo(IntPtr hConsoleOutput, ref CONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo);
  34.  
  35.  
  36.  
  37.     public void Limpiar()
  38.     {
  39.       int hWrittenChars = 0;
  40.       CONSOLE_SCREEN_BUFFER_INFO strConsoleInfo = new CONSOLE_SCREEN_BUFFER_INFO();      
  41.       COORD Home;    
  42.       Home.x = Home.y = 0;
  43.       GetConsoleScreenBufferInfo(hConsoleHandle, ref strConsoleInfo);
  44.       FillConsoleOutputCharacter(hConsoleHandle, EMPTY, strConsoleInfo.dwSize.x * strConsoleInfo.dwSize.y, Home, ref hWrittenChars);
  45.       SetConsoleCursorPosition(hConsoleHandle, Home);
  46.     }
  47.  
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Dll De C++ En C#
« Respuesta #6 en: Martes 27 de Marzo de 2007, 16:17 »
0
Mira, he seguido los pasos y me va exceltente, pero tope con algo.

Hay un tipo de la siguiente manera declarado en el .H :

typedef long nuevo_tipo

Y no se como declararlo en C#, ya q me envia error de referencia de ensamblado, aunq la declare de la siguiente manera:

long nuevo_tipo;
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Dll De C++ En C#
« Respuesta #7 en: Martes 27 de Marzo de 2007, 16:44 »
0
Código: Text
  1.  
  2. namespace
  3.  
  4. {
  5.    public enum nuevo_tipo: ulong { }
  6. }
  7.  
  8.  
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Dll De C++ En C#
« Respuesta #8 en: Martes 27 de Marzo de 2007, 18:02 »
0
Aun asi declarandolos public, me dice ahora que las variables no son accesibles debido a su nivel de proteccion.

Que raro.

A que se debe esto?, o que estaré haciendo mal.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Dll De C++ En C#
« Respuesta #9 en: Martes 27 de Marzo de 2007, 18:12 »
0
segurio que la declaraste dentro del namespace pero por fuera de cualquier clase?
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Dll De C++ En C#
« Respuesta #10 en: Martes 27 de Marzo de 2007, 18:29 »
0
Si, se me habia pasado declarar los tipos dentro de manera public, pero ahora me surgieron mas errores.

Mas que nada con la asignacion de los campos en enum.

No son compatibles los tipos, obviamente, unos son strings y no puedo pasarlos a int. Pero como asigno un valor en un enum (que por lo general es un string) a otro que es un int por ejemplo.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Dll De C++ En C#
« Respuesta #11 en: Martes 27 de Marzo de 2007, 18:33 »
0
Cita de: "Neopro"
Si, se me habia pasado declarar los tipos dentro de manera public, pero ahora me surgieron mas errores.

Mas que nada con la asignacion de los campos en enum.

No son compatibles los tipos, obviamente, unos son strings y no puedo pasarlos a int. Pero como asigno un valor en un enum (que por lo general es un string) a otro que es un int por ejemplo.
no te entiendo muy bien... explicate mejor o coloca el código para mirar.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Dll De C++ En C#
« Respuesta #12 en: Lunes 9 de Abril de 2007, 22:58 »
0
Quise postear en esta misma discusión, ya que tengo un problema con los miembros VOID al exportar una DLL, ya que el compilador me dice :

"El parámetro void no es válido".

Entonces que hago para declarar esas variables?.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Dll De C++ En C#
« Respuesta #13 en: Martes 10 de Abril de 2007, 15:37 »
0
como lo estas haciendo?
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Dll De C++ En C#
« Respuesta #14 en: Martes 10 de Abril de 2007, 18:09 »
0
Es asi:

Código: Text
  1. [DllImport("dll.dll")]
  2. public unsafe static extern int funcion_externa(modo tipo_modo, Byte[] dato1, formato tipo_formato, void valor,Byte[] objeto,out Byte*[] dato_de_vuelta,out int* largo_dato,out Error* tipo_error);
  3.  

Declaro cada uno de los parametros y esta es mi llamada a la funcion dentro de unsafe:

Código: Text
  1. funcion_externa(modo tipo_modo, dato1, tipo_formato, objeto,out dato_de_vuelta,out largo_dato, out tipo_error);
  2.  

Estoy omitiendo el VOID en los 2 ejemplos, arriba solo lo puse como debería ir en el codigo.

Por lo que he averiguado los miembros VOID no se declaran, asi que opté por omitirlos, pero aun no me funciona la llamada, porque cuando llamo a la funcion me envia otro error en el ultimo parametro:

"No se puede calcular la referencia de 'parameter #7: Los punteros no pueden hacer referencia a estructuras con referencias calculadas. Utilice ByRef en su lugar."
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Dll De C++ En C#
« Respuesta #15 en: Martes 10 de Abril de 2007, 19:19 »
0
mira el ejemplo que te puse mas arriba, los punteros se declaran como IntPtr
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Dll De C++ En C#
« Respuesta #16 en: Martes 10 de Abril de 2007, 20:24 »
0
Al realizar ese cambio me envia un error:

Intento de leer o escribir en la memoria protegida. A menudo esto indica que hay otra memoria dañada.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Dll De C++ En C#
« Respuesta #17 en: Martes 10 de Abril de 2007, 20:43 »
0
Cita de: "Neopro"
Es asi:

Código: Text
  1. [DllImport("dll.dll")]
  2. public unsafe static extern int funcion_externa(modo tipo_modo, Byte[] dato1, formato tipo_formato, void valor,Byte[] objeto,out Byte*[] dato_de_vuelta,out int* largo_dato,out Error* tipo_error);
  3.  

Declaro cada uno de los parametros y esta es mi llamada a la funcion dentro de unsafe:

Código: Text
  1. funcion_externa(modo tipo_modo, dato1, tipo_formato, objeto,out dato_de_vuelta,out largo_dato, out tipo_error);
  2.  

Estoy omitiendo el VOID en los 2 ejemplos, arriba solo lo puse como debería ir en el codigo.

Por lo que he averiguado los miembros VOID no se declaran, asi que opté por omitirlos, pero aun no me funciona la llamada, porque cuando llamo a la funcion me envia otro error en el ultimo parametro:

"No se puede calcular la referencia de 'parameter #7: Los punteros no pueden hacer referencia a estructuras con referencias calculadas. Utilice ByRef en su lugar."
Para usar el tipo void se hace de la manera habitual:

http://www.csharphelp.com/archives/archive79.html

por lo cual sigo insistiendo en que el problema esta en la utilización de punteros que estas haciendo para usar de manera externa la librería que tienes.

Para mi
 Byte*[] dato_de_vuelta,

deberia ser byte[][]


y int* largo_dato

deberia ser

IntPtr,

respecto a las otras que usas habría que ver la declaración original de la función Vs la declaración de tipos internos que has hecho.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

RaYWoLF

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Dll De C++ En C#
« Respuesta #18 en: Miércoles 27 de Febrero de 2008, 12:41 »
0
Buenas, se que este hilo es un poco viejo, pero tengo una duda referente a lo mismo...

Yo quiero importar una dll de c++ en c#. Con los metodos que no tienen parametros no he tenido ningun problema, pero en cuanto hay parametros enseguida he encontrado los problemas....

Esta es la declaracion de la funcion en el .h
Código: Text
  1.  
  2. // return values:
  3. // 0 - ok
  4. // 1 - disk error
  5. API int Get_info(
  6.   char *File_name,  //IN
  7.   INFO *Info    //OUT
  8. );
  9.  
  10.  

Y este es mi codigo en c#:

Código: Text
  1.  
  2. [DllImport("midll.dll", EntryPoint = "Get_info", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
  3. private unsafe static extern int Get_info(ref string File_name, ref INFO Info);
  4.  
  5.  

Tanto si pongo ref string, como si pongo char[] me devuelve siempre el codigo 1 (que corresponde con disk error). No se si estoy haciendo mal la llamada o es porque simplemente no encuentra el fichero... ¿alguna idea?

RaYWoLF

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Dll De C++ En C#
« Respuesta #19 en: Miércoles 5 de Marzo de 2008, 15:54 »
0
Al final parece que con esto funciona:
Código: Text
  1.  
  2. [DllImport("midll.dll", EntryPoint = "Get_info")]
  3. private unsafe static extern int Get_info(string File_name, ref INFO Info);
  4.  
  5.  
Con esto ya me encuentra bien el fichero, el problema ahora lo tengo con la declaración del struct INFO. Voy a poner los diferentes tipos de datos que tiene el struct y la "traducción" que hecho, por si veis algo raro...

Código: Text
  1.  
  2. C++
  3. typedef enum {
  4.   UNDEFINED,
  5.   TRUCK,
  6.   CAR
  7. } VEHICLE_TYPE;
  8.  
  9.  
  10. C#
  11. enum VEHICLE_TYPE
  12. {
  13.      UNDEFINED,
  14.      TRUCK,
  15.      CAR
  16. }
  17.  
  18.  
  19. char Serial_number[8];    -->   fixed char Serial_number[8]
  20. BYTE --> byte
  21. WORD --> ushort (tambien he probado int, que lo vi en otro sitio. Los resultados son diferentes pero siguen sin ser correctos).
  22. bool --> bool
  23. DWORD --> uint
  24.  
  25.  
  26. C++
  27. typedef struct
  28. {
  29.   ....
  30. }INFO;
  31.  
  32. C#
  33. [StructLayout(LayoutKind.Sequential)]
  34. unsafe struct INFO
  35. {
  36.    ......
  37. }
  38.  
  39.  

jabenavidesm

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Dll De C++ En C#
« Respuesta #20 en: Jueves 25 de Septiembre de 2008, 21:46 »
0
Hola Talvez alguno de ustede puede apoyarme con una duda
Tengo una dll donde declaro 2 metodos esta hecha en c#, pero necesito expotarla a dll que pueda ser ocupada desde otros lenguajes como una API, que debo hacer para poder exportarla o modificarla???