SlideShare una empresa de Scribd logo
1 de 16
Descargar para leer sin conexión
@_jdepaz José de Paz desarrollo.escuintla@gmail.com 
Tutorial 
Consumir desde C# DLL desarrollada en C++ 
Ingredientes: 
-Visual Studio Express 2013 for Windows Desktop 
-Dependency Walker 
-Conocimientos de C y C++ (un poco más de lo básico) 
-Autodidacta 
¿Por qué? 
Porque si no disponemos de una aplicación para ofuscar el código 
fuente en C# o bien para ofuscar las librerías creadas en C#, entonces la 
solución viable sería construir una librería en C++, porque hasta el 
momento no conozco una aplicación para descompilar librerías 
desarrolladas en C++ y que te devuelve el código fuente. 
Todos sabemos (bueno eso creo…) que existen aplicaciones para 
descompilar código C#, de las cuales puedo mencionar “ILSpy” 
http://ilspy.net/, de la cual me he favorecido muchas veces. 
Hay aplicaciones de pago para ofuscar código C# muy buenas, como por 
ejemplo: 
Crypto Obfuscator For .NET 
http://www.ssware.com/cryptoobfuscator/obfuscator-net.htm 
de la cual también puedo decir que, saca la tarea para lo que se 
necesita. 
Por último: Lo nativo (Win32) siempre será mejor que lo interpretado.
@_jdepaz José de Paz desarrollo.escuintla@gmail.com 
Pasos: 
1. Crear solución en Visual Studio Express 2013 de tipo C++ 
New ProjectVisual C++Win32 Project: 
Para este ejemplo, el proyecto tendrá el nombre “MyDll” 
Luego: 
 En el asistente “Win32 Application Wizard”: Next 
 En “Application type” seleccionar “DLL” 
 Por ultimo “Finish”. 
2. La DLL devolverá de C++ a C# los siguientes tipos de datos: 
C++ C# 
LPTSTR string 
char * string 
int int 
double double 
LPSTR string 
const char * IntPtr 
Así mismo se devolverá una estructura que contiene todos los 
tipos de datos de la tabla anterior.
@_jdepaz José de Paz desarrollo.escuintla@gmail.com 
3. Crear las funciones de retorno de valores: 
Para realizar este paso, es necesario agregar un archivo de 
encabezado (header), el cual se llamará “MyDll.h”, entonces, 
seleccionar el proyecto de la solución y proceder a agregar un 
nuevo ítem, el cual será de tipo “Header File (.h)”. En este archivo 
se incluirá el encabezado “#include <windows.h>” y se agregarán 
las definiciones para la exportación de funciones, es decir el 
archivo “MyDll.h” deberá quedar así (por el momento):
@_jdepaz José de Paz desarrollo.escuintla@gmail.com 
4. Definir las funciones de exportación: 
Las funciones a exportar serás las siguientes: 
 LPTSTR ExportaLptstr() 
 char * ExportaCharA() 
 int ExportaInt() 
 double ExportaDouble() 
 LPSTR ExportaLpstr() 
 const char * ExportaConstChar() 
 BOOL ExportaEstructura(MiEstructura *miEstructura) 
En el archivo “MyDll.h” las funciones de exportación quedarán así:
@_jdepaz José de Paz desarrollo.escuintla@gmail.com 
Si realizamos una compilación (Rebuild) previa del proyecto 
(Ctrl+Alt+F7), la misma se debe realizar sin ningún problema (al menos 
eso espero): 
5. Implementar las funciones en el archivo “MyDll.cpp” 
Las funciones deben ser implementadas y por supuesto tienen que 
devolver el tipo de valor según la definición. Si alguien se pregunta 
el por qué se está utilizando -extern “C”- en cada función y se 
supone que es una DLL en C++, al terminar este proceso 
encontrarán la respuesta. 
A continuación la implementación de cada función:
@_jdepaz José de Paz desarrollo.escuintla@gmail.com
@_jdepaz José de Paz desarrollo.escuintla@gmail.com 
6. Compilar 
Nuevamente compilar el proyecto, y sin esperar, no tiene ningún 
motivo para darnos algún error: 
7. Configuración de compilación en “MyDll.dll” 
Si, resulta que: cuando se invoca la función en C#:
@_jdepaz José de Paz desarrollo.escuintla@gmail.com 
La aplicación termina con código de error, entonces para que esto 
no suceda, es necesario establecer una propiedad en la 
compilación de la DLL: 
La configuración se realiza accediendo a las propiedades del 
proyecto (ya saben, haciendo clic con el botón derecho, etc., etc.) 
8. Comprobar MyDll.dll con “Dependency Walker” 
Hay una aplicación llamada “Dependency Walker”, si bien su 
nombre lo expresa muy bien para que nos sirve, en este caso nos 
servirá para verificar las funciones que tiene expuestas la DLL que 
acabamos de compilar. Esta aplicación la pueden encontrar y 
descargar utilizando el buscador de su preferencia.
@_jdepaz José de Paz desarrollo.escuintla@gmail.com 
Entonces, utilizando “Dependency Walker”; busca la carpeta de 
depuración en donde encontrarás el archivo “MyDll.dll”, 
procedemos a abrir la aplicación “Dependency Walker” y luego a 
cargar la DLL, entonces se mostrarán las funciones expuestas: 
9. Crear proyecto en C# 
En la misma solución, vamos a agregar un nuevo proyecto, en este 
caso un proyecto C# de consola, el cual se llamara “TestMyDll” (es 
una sugerencia, porque puede ser a como bien te guste):
@_jdepaz José de Paz desarrollo.escuintla@gmail.com 
10. Importar funciones de la DLL “MyDll.dll” 
Bien, ahora en la aplicación de consola vamos a proceder a 
importar las funciones que nos provee la DLL. 
NOTA: La DLL “MyDll.dll” tiene que estar presente en la ruta 
donde se encuentra el ejecutable de la aplicación de consola, en 
este caso como estamos en modo depuración, se tiene que copiar 
la DLL en la carpeta “Debug” o bien “Release” si así fuera, por 
ejemplo:
@_jdepaz José de Paz desarrollo.escuintla@gmail.com 
Seguimos, en “Program.cs” (que es donde está definida la función 
principal; o sea “Main”) vamos a escribir un poco de código en 
donde se declaran las funciones que exporta la DLL “MyDll.dll”, y 
más o menos nos debe quedar así:
@_jdepaz José de Paz desarrollo.escuintla@gmail.com 
Si compilamos y ejecutamos, posiblemente no veamos la salida, 
entonces tendríamos que poner un punto de interrupción y 
efectivamente veremos el resultado que nos devuelve la función: 
Procedamos a realizar el respectivo análisis: 
 La función de la DLL en C++ está definida así: 
Esto quiere decir: cuando una función que devuelva un tipo de 
dato “char *”, en C# se debe recibir como “IntPtr” y luego utilizar
@_jdepaz José de Paz desarrollo.escuintla@gmail.com 
la función Marshal.PtrToStringAnsi para convertir el valor del 
puntero a “string” respectivamente. 
Esta fue la primera toma de contacto, ahora resta declarar las 
demás funciones: 
Y como verán, en las funciones que devuelven “LPTSTR” y “LPSTR” 
también se declaran los valores de retorno como “IntPtr”. 
Analizando un poco: las funciones que devuelven “cadenas de 
caracteres” se declaran como “IntPtr” y luego se utiliza la función 
la función Marshal.PtrToStringAnsi respectivamente.
@_jdepaz José de Paz desarrollo.escuintla@gmail.com 
Ahora, se invocan (o se llaman) las funciones para su respectivo 
uso: 
Y por supuesto, seguido realizamos la compilación y ejecución en 
modo “Debug”, y ponemos un punto de interrupción en el 
“return” y sólo resta ver los resultados que tienen las variables: 
_recibeCharA, _recibeConstChar, _recibeDouble, _recibeInt, 
_recibeLpStr y _recibeLptStr:
@_jdepaz José de Paz desarrollo.escuintla@gmail.com 
Con zoom:
@_jdepaz José de Paz desarrollo.escuintla@gmail.com 
11. Función que devuelve una estructura 
Queda pendiente para una próxima entrega…

Más contenido relacionado

La actualidad más candente

Trabajo de ejercicios de lenguaje c
Trabajo de ejercicios de lenguaje cTrabajo de ejercicios de lenguaje c
Trabajo de ejercicios de lenguaje coswnes92
 
How to use the new Domino Query Language
How to use the new Domino Query LanguageHow to use the new Domino Query Language
How to use the new Domino Query LanguageTim Davis
 
Effective Spring Transaction Management
Effective Spring Transaction ManagementEffective Spring Transaction Management
Effective Spring Transaction ManagementUMA MAHESWARI
 
Don't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using MocksDon't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using MocksVictor Rentea
 
Using Xcore with Xtext
Using Xcore with XtextUsing Xcore with Xtext
Using Xcore with XtextHolger Schill
 
12 컨트롤에서의 메세지 처리
12 컨트롤에서의 메세지 처리12 컨트롤에서의 메세지 처리
12 컨트롤에서의 메세지 처리jaypi Ko
 
06 일반적 유형의 프로그램
06 일반적 유형의 프로그램06 일반적 유형의 프로그램
06 일반적 유형의 프로그램jaypi Ko
 
Python-oop
Python-oopPython-oop
Python-oopRTS Tech
 
Tutorial de Visual basic
Tutorial de Visual basicTutorial de Visual basic
Tutorial de Visual basicEdgard Cabus
 
Programacion RPG: Conceptos ILE
Programacion RPG: Conceptos ILEProgramacion RPG: Conceptos ILE
Programacion RPG: Conceptos ILEGiovanny Guillen
 
Namespace in C++ Programming Language
Namespace in C++ Programming LanguageNamespace in C++ Programming Language
Namespace in C++ Programming LanguageHimanshu Choudhary
 
Client-side JavaScript
Client-side JavaScriptClient-side JavaScript
Client-side JavaScriptLilia Sfaxi
 
7 rules of simple and maintainable code
7 rules of simple and maintainable code7 rules of simple and maintainable code
7 rules of simple and maintainable codeGeshan Manandhar
 
11 노티피케이션코드
11 노티피케이션코드11 노티피케이션코드
11 노티피케이션코드jaypi Ko
 
OOP in C++
OOP in C++OOP in C++
OOP in C++ppd1961
 
clean code book summary - uncle bob - English version
clean code book summary - uncle bob - English versionclean code book summary - uncle bob - English version
clean code book summary - uncle bob - English versionsaber tabatabaee
 

La actualidad más candente (20)

Trabajo de ejercicios de lenguaje c
Trabajo de ejercicios de lenguaje cTrabajo de ejercicios de lenguaje c
Trabajo de ejercicios de lenguaje c
 
How to use the new Domino Query Language
How to use the new Domino Query LanguageHow to use the new Domino Query Language
How to use the new Domino Query Language
 
PythonOOP
PythonOOPPythonOOP
PythonOOP
 
Effective Spring Transaction Management
Effective Spring Transaction ManagementEffective Spring Transaction Management
Effective Spring Transaction Management
 
Don't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using MocksDon't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using Mocks
 
Using Xcore with Xtext
Using Xcore with XtextUsing Xcore with Xtext
Using Xcore with Xtext
 
12 컨트롤에서의 메세지 처리
12 컨트롤에서의 메세지 처리12 컨트롤에서의 메세지 처리
12 컨트롤에서의 메세지 처리
 
06 일반적 유형의 프로그램
06 일반적 유형의 프로그램06 일반적 유형의 프로그램
06 일반적 유형의 프로그램
 
Python-oop
Python-oopPython-oop
Python-oop
 
IBM i - AS/400 - SDA
IBM i - AS/400 - SDAIBM i - AS/400 - SDA
IBM i - AS/400 - SDA
 
Tutorial de Visual basic
Tutorial de Visual basicTutorial de Visual basic
Tutorial de Visual basic
 
Programacion RPG: Conceptos ILE
Programacion RPG: Conceptos ILEProgramacion RPG: Conceptos ILE
Programacion RPG: Conceptos ILE
 
Namespace in C++ Programming Language
Namespace in C++ Programming LanguageNamespace in C++ Programming Language
Namespace in C++ Programming Language
 
Client-side JavaScript
Client-side JavaScriptClient-side JavaScript
Client-side JavaScript
 
7 rules of simple and maintainable code
7 rules of simple and maintainable code7 rules of simple and maintainable code
7 rules of simple and maintainable code
 
C# in depth
C# in depthC# in depth
C# in depth
 
11 노티피케이션코드
11 노티피케이션코드11 노티피케이션코드
11 노티피케이션코드
 
Introduction to Visual Basic
Introduction to Visual Basic Introduction to Visual Basic
Introduction to Visual Basic
 
OOP in C++
OOP in C++OOP in C++
OOP in C++
 
clean code book summary - uncle bob - English version
clean code book summary - uncle bob - English versionclean code book summary - uncle bob - English version
clean code book summary - uncle bob - English version
 

Similar a Consumir DLL C++ desde C

C sharp manual[1]
C sharp manual[1]C sharp manual[1]
C sharp manual[1]Kalizbeth
 
De algoritmo a programa en c++
De algoritmo a programa en c++De algoritmo a programa en c++
De algoritmo a programa en c++maribelduran
 
151442532 tutorial-de-c
151442532 tutorial-de-c151442532 tutorial-de-c
151442532 tutorial-de-cDaniel Verdin
 
2154086 curso-c-c-con-clase
2154086 curso-c-c-con-clase2154086 curso-c-c-con-clase
2154086 curso-c-c-con-claseEdgar Rodriguez
 
Cursocpp
CursocppCursocpp
Cursocppzotek
 
Conceptos de c
Conceptos de cConceptos de c
Conceptos de cDrakan55
 
Desarrollo De Componentes Com
Desarrollo De Componentes ComDesarrollo De Componentes Com
Desarrollo De Componentes Comcharlyasap
 
Varios tema de c++ por (alvaro tejada)
Varios tema de c++ por (alvaro tejada)Varios tema de c++ por (alvaro tejada)
Varios tema de c++ por (alvaro tejada)javiel162009
 
El arte de programar c++ - versión 3.0
El arte de programar   c++ - versión 3.0El arte de programar   c++ - versión 3.0
El arte de programar c++ - versión 3.0javiel162009
 
Programación en c primer programa en c
Programación en c primer programa en cProgramación en c primer programa en c
Programación en c primer programa en cFree Lancer
 
Estructura basica de_c_
Estructura basica de_c_Estructura basica de_c_
Estructura basica de_c_LaishaXime
 

Similar a Consumir DLL C++ desde C (20)

Actividad dll
Actividad dllActividad dll
Actividad dll
 
C sharp manual
C sharp manualC sharp manual
C sharp manual
 
C sharp manual
C sharp manualC sharp manual
C sharp manual
 
C sharp manual[1]
C sharp manual[1]C sharp manual[1]
C sharp manual[1]
 
C sharp manual
C sharp manualC sharp manual
C sharp manual
 
De algoritmo a programa en c++
De algoritmo a programa en c++De algoritmo a programa en c++
De algoritmo a programa en c++
 
Ikgi
IkgiIkgi
Ikgi
 
151442532 tutorial-de-c
151442532 tutorial-de-c151442532 tutorial-de-c
151442532 tutorial-de-c
 
2154086 curso-c-c-con-clase
2154086 curso-c-c-con-clase2154086 curso-c-c-con-clase
2154086 curso-c-c-con-clase
 
Cursocpp
CursocppCursocpp
Cursocpp
 
Reporte bernardino melgarejo lugo
Reporte bernardino melgarejo lugoReporte bernardino melgarejo lugo
Reporte bernardino melgarejo lugo
 
37975756-Guia-de-C
37975756-Guia-de-C37975756-Guia-de-C
37975756-Guia-de-C
 
PROGRAMACION
PROGRAMACIONPROGRAMACION
PROGRAMACION
 
Conceptos de c
Conceptos de cConceptos de c
Conceptos de c
 
Desarrollo De Componentes Com
Desarrollo De Componentes ComDesarrollo De Componentes Com
Desarrollo De Componentes Com
 
Varios tema de c++ por (alvaro tejada)
Varios tema de c++ por (alvaro tejada)Varios tema de c++ por (alvaro tejada)
Varios tema de c++ por (alvaro tejada)
 
El arte de programar c++ - versión 3.0
El arte de programar   c++ - versión 3.0El arte de programar   c++ - versión 3.0
El arte de programar c++ - versión 3.0
 
Prueba
PruebaPrueba
Prueba
 
Programación en c primer programa en c
Programación en c primer programa en cProgramación en c primer programa en c
Programación en c primer programa en c
 
Estructura basica de_c_
Estructura basica de_c_Estructura basica de_c_
Estructura basica de_c_
 

Más de Desarrollo Escuintla

Creación de un servicio RESTful utilizando Java y WildFly -I PARTE-
Creación de un servicio RESTful utilizando Java y WildFly -I PARTE-Creación de un servicio RESTful utilizando Java y WildFly -I PARTE-
Creación de un servicio RESTful utilizando Java y WildFly -I PARTE-Desarrollo Escuintla
 
FriendlyARM Mini2440 Ubuntu 10.04.4
FriendlyARM Mini2440 Ubuntu 10.04.4FriendlyARM Mini2440 Ubuntu 10.04.4
FriendlyARM Mini2440 Ubuntu 10.04.4Desarrollo Escuintla
 
NReports -Diseñador y Generador de Informes-
NReports -Diseñador y Generador de Informes-NReports -Diseñador y Generador de Informes-
NReports -Diseñador y Generador de Informes-Desarrollo Escuintla
 
Tutorial usando FIBplus en Report Manager
Tutorial usando FIBplus en Report ManagerTutorial usando FIBplus en Report Manager
Tutorial usando FIBplus en Report ManagerDesarrollo Escuintla
 
Utilizando outlook para revision de correo electronico
Utilizando outlook para revision de correo electronicoUtilizando outlook para revision de correo electronico
Utilizando outlook para revision de correo electronicoDesarrollo Escuintla
 

Más de Desarrollo Escuintla (8)

Creación de un servicio RESTful utilizando Java y WildFly -I PARTE-
Creación de un servicio RESTful utilizando Java y WildFly -I PARTE-Creación de un servicio RESTful utilizando Java y WildFly -I PARTE-
Creación de un servicio RESTful utilizando Java y WildFly -I PARTE-
 
Lazarus
LazarusLazarus
Lazarus
 
FriendlyARM Mini2440 Ubuntu 10.04.4
FriendlyARM Mini2440 Ubuntu 10.04.4FriendlyARM Mini2440 Ubuntu 10.04.4
FriendlyARM Mini2440 Ubuntu 10.04.4
 
NReports -Diseñador y Generador de Informes-
NReports -Diseñador y Generador de Informes-NReports -Diseñador y Generador de Informes-
NReports -Diseñador y Generador de Informes-
 
Tutorial usando FIBplus en Report Manager
Tutorial usando FIBplus en Report ManagerTutorial usando FIBplus en Report Manager
Tutorial usando FIBplus en Report Manager
 
Utilizando outlook para revision de correo electronico
Utilizando outlook para revision de correo electronicoUtilizando outlook para revision de correo electronico
Utilizando outlook para revision de correo electronico
 
Vulnerabilidad thomson
Vulnerabilidad thomsonVulnerabilidad thomson
Vulnerabilidad thomson
 
Vulnerabilidad thomson
Vulnerabilidad thomsonVulnerabilidad thomson
Vulnerabilidad thomson
 

Último

R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaarkananubis
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..RobertoGumucio2
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxMariaBurgos55
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxJOSEFERNANDOARENASCA
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 

Último (20)

R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en mina
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptx
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptx
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 

Consumir DLL C++ desde C

  • 1. @_jdepaz José de Paz desarrollo.escuintla@gmail.com Tutorial Consumir desde C# DLL desarrollada en C++ Ingredientes: -Visual Studio Express 2013 for Windows Desktop -Dependency Walker -Conocimientos de C y C++ (un poco más de lo básico) -Autodidacta ¿Por qué? Porque si no disponemos de una aplicación para ofuscar el código fuente en C# o bien para ofuscar las librerías creadas en C#, entonces la solución viable sería construir una librería en C++, porque hasta el momento no conozco una aplicación para descompilar librerías desarrolladas en C++ y que te devuelve el código fuente. Todos sabemos (bueno eso creo…) que existen aplicaciones para descompilar código C#, de las cuales puedo mencionar “ILSpy” http://ilspy.net/, de la cual me he favorecido muchas veces. Hay aplicaciones de pago para ofuscar código C# muy buenas, como por ejemplo: Crypto Obfuscator For .NET http://www.ssware.com/cryptoobfuscator/obfuscator-net.htm de la cual también puedo decir que, saca la tarea para lo que se necesita. Por último: Lo nativo (Win32) siempre será mejor que lo interpretado.
  • 2. @_jdepaz José de Paz desarrollo.escuintla@gmail.com Pasos: 1. Crear solución en Visual Studio Express 2013 de tipo C++ New ProjectVisual C++Win32 Project: Para este ejemplo, el proyecto tendrá el nombre “MyDll” Luego:  En el asistente “Win32 Application Wizard”: Next  En “Application type” seleccionar “DLL”  Por ultimo “Finish”. 2. La DLL devolverá de C++ a C# los siguientes tipos de datos: C++ C# LPTSTR string char * string int int double double LPSTR string const char * IntPtr Así mismo se devolverá una estructura que contiene todos los tipos de datos de la tabla anterior.
  • 3. @_jdepaz José de Paz desarrollo.escuintla@gmail.com 3. Crear las funciones de retorno de valores: Para realizar este paso, es necesario agregar un archivo de encabezado (header), el cual se llamará “MyDll.h”, entonces, seleccionar el proyecto de la solución y proceder a agregar un nuevo ítem, el cual será de tipo “Header File (.h)”. En este archivo se incluirá el encabezado “#include <windows.h>” y se agregarán las definiciones para la exportación de funciones, es decir el archivo “MyDll.h” deberá quedar así (por el momento):
  • 4. @_jdepaz José de Paz desarrollo.escuintla@gmail.com 4. Definir las funciones de exportación: Las funciones a exportar serás las siguientes:  LPTSTR ExportaLptstr()  char * ExportaCharA()  int ExportaInt()  double ExportaDouble()  LPSTR ExportaLpstr()  const char * ExportaConstChar()  BOOL ExportaEstructura(MiEstructura *miEstructura) En el archivo “MyDll.h” las funciones de exportación quedarán así:
  • 5. @_jdepaz José de Paz desarrollo.escuintla@gmail.com Si realizamos una compilación (Rebuild) previa del proyecto (Ctrl+Alt+F7), la misma se debe realizar sin ningún problema (al menos eso espero): 5. Implementar las funciones en el archivo “MyDll.cpp” Las funciones deben ser implementadas y por supuesto tienen que devolver el tipo de valor según la definición. Si alguien se pregunta el por qué se está utilizando -extern “C”- en cada función y se supone que es una DLL en C++, al terminar este proceso encontrarán la respuesta. A continuación la implementación de cada función:
  • 6. @_jdepaz José de Paz desarrollo.escuintla@gmail.com
  • 7. @_jdepaz José de Paz desarrollo.escuintla@gmail.com 6. Compilar Nuevamente compilar el proyecto, y sin esperar, no tiene ningún motivo para darnos algún error: 7. Configuración de compilación en “MyDll.dll” Si, resulta que: cuando se invoca la función en C#:
  • 8. @_jdepaz José de Paz desarrollo.escuintla@gmail.com La aplicación termina con código de error, entonces para que esto no suceda, es necesario establecer una propiedad en la compilación de la DLL: La configuración se realiza accediendo a las propiedades del proyecto (ya saben, haciendo clic con el botón derecho, etc., etc.) 8. Comprobar MyDll.dll con “Dependency Walker” Hay una aplicación llamada “Dependency Walker”, si bien su nombre lo expresa muy bien para que nos sirve, en este caso nos servirá para verificar las funciones que tiene expuestas la DLL que acabamos de compilar. Esta aplicación la pueden encontrar y descargar utilizando el buscador de su preferencia.
  • 9. @_jdepaz José de Paz desarrollo.escuintla@gmail.com Entonces, utilizando “Dependency Walker”; busca la carpeta de depuración en donde encontrarás el archivo “MyDll.dll”, procedemos a abrir la aplicación “Dependency Walker” y luego a cargar la DLL, entonces se mostrarán las funciones expuestas: 9. Crear proyecto en C# En la misma solución, vamos a agregar un nuevo proyecto, en este caso un proyecto C# de consola, el cual se llamara “TestMyDll” (es una sugerencia, porque puede ser a como bien te guste):
  • 10. @_jdepaz José de Paz desarrollo.escuintla@gmail.com 10. Importar funciones de la DLL “MyDll.dll” Bien, ahora en la aplicación de consola vamos a proceder a importar las funciones que nos provee la DLL. NOTA: La DLL “MyDll.dll” tiene que estar presente en la ruta donde se encuentra el ejecutable de la aplicación de consola, en este caso como estamos en modo depuración, se tiene que copiar la DLL en la carpeta “Debug” o bien “Release” si así fuera, por ejemplo:
  • 11. @_jdepaz José de Paz desarrollo.escuintla@gmail.com Seguimos, en “Program.cs” (que es donde está definida la función principal; o sea “Main”) vamos a escribir un poco de código en donde se declaran las funciones que exporta la DLL “MyDll.dll”, y más o menos nos debe quedar así:
  • 12. @_jdepaz José de Paz desarrollo.escuintla@gmail.com Si compilamos y ejecutamos, posiblemente no veamos la salida, entonces tendríamos que poner un punto de interrupción y efectivamente veremos el resultado que nos devuelve la función: Procedamos a realizar el respectivo análisis:  La función de la DLL en C++ está definida así: Esto quiere decir: cuando una función que devuelva un tipo de dato “char *”, en C# se debe recibir como “IntPtr” y luego utilizar
  • 13. @_jdepaz José de Paz desarrollo.escuintla@gmail.com la función Marshal.PtrToStringAnsi para convertir el valor del puntero a “string” respectivamente. Esta fue la primera toma de contacto, ahora resta declarar las demás funciones: Y como verán, en las funciones que devuelven “LPTSTR” y “LPSTR” también se declaran los valores de retorno como “IntPtr”. Analizando un poco: las funciones que devuelven “cadenas de caracteres” se declaran como “IntPtr” y luego se utiliza la función la función Marshal.PtrToStringAnsi respectivamente.
  • 14. @_jdepaz José de Paz desarrollo.escuintla@gmail.com Ahora, se invocan (o se llaman) las funciones para su respectivo uso: Y por supuesto, seguido realizamos la compilación y ejecución en modo “Debug”, y ponemos un punto de interrupción en el “return” y sólo resta ver los resultados que tienen las variables: _recibeCharA, _recibeConstChar, _recibeDouble, _recibeInt, _recibeLpStr y _recibeLptStr:
  • 15. @_jdepaz José de Paz desarrollo.escuintla@gmail.com Con zoom:
  • 16. @_jdepaz José de Paz desarrollo.escuintla@gmail.com 11. Función que devuelve una estructura Queda pendiente para una próxima entrega…