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

Exception Handling in C#
Exception Handling in C#Exception Handling in C#
Exception Handling in C#Abid Kohistani
 
Classes and Objects in C#
Classes and Objects in C#Classes and Objects in C#
Classes and Objects in C#Adeel Rasheed
 
Golang and Eco-System Introduction / Overview
Golang and Eco-System Introduction / OverviewGolang and Eco-System Introduction / Overview
Golang and Eco-System Introduction / OverviewMarkus Schneider
 
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịchPhân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịchLevis Nickaster
 
C# Exceptions Handling
C# Exceptions Handling C# Exceptions Handling
C# Exceptions Handling sharqiyem
 
CLASSES AND OBJECTS IN C++ +2 COMPUTER SCIENCE
CLASSES AND OBJECTS IN C++ +2 COMPUTER SCIENCECLASSES AND OBJECTS IN C++ +2 COMPUTER SCIENCE
CLASSES AND OBJECTS IN C++ +2 COMPUTER SCIENCEVenugopalavarma Raja
 
Utilizing kotlin flows in an android application
Utilizing kotlin flows in an android applicationUtilizing kotlin flows in an android application
Utilizing kotlin flows in an android applicationSeven Peaks Speaks
 
File handling & regular expressions in python programming
File handling & regular expressions in python programmingFile handling & regular expressions in python programming
File handling & regular expressions in python programmingSrinivas Narasegouda
 
sSCOPE RESOLUTION OPERATOR.pptx
sSCOPE RESOLUTION OPERATOR.pptxsSCOPE RESOLUTION OPERATOR.pptx
sSCOPE RESOLUTION OPERATOR.pptxNidhi Mehra
 
Internal commands of dos
Internal commands of dosInternal commands of dos
Internal commands of dosNargiskhan786
 
packages in java & c++
packages in java & c++packages in java & c++
packages in java & c++pankaj chelak
 
Taller: Prueba Unitaria con JUnit en NetBeans
Taller: Prueba Unitaria con JUnit en NetBeansTaller: Prueba Unitaria con JUnit en NetBeans
Taller: Prueba Unitaria con JUnit en NetBeansEmerson Garay
 
Complete C programming Language Course
Complete C programming Language CourseComplete C programming Language Course
Complete C programming Language CourseVivek chan
 
JavaScript and jQuery - Web Technologies (1019888BNR)
JavaScript and jQuery - Web Technologies (1019888BNR)JavaScript and jQuery - Web Technologies (1019888BNR)
JavaScript and jQuery - Web Technologies (1019888BNR)Beat Signer
 

La actualidad más candente (20)

Exception Handling in C#
Exception Handling in C#Exception Handling in C#
Exception Handling in C#
 
Modular programming
Modular programmingModular programming
Modular programming
 
Classes and Objects in C#
Classes and Objects in C#Classes and Objects in C#
Classes and Objects in C#
 
Golang and Eco-System Introduction / Overview
Golang and Eco-System Introduction / OverviewGolang and Eco-System Introduction / Overview
Golang and Eco-System Introduction / Overview
 
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịchPhân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
 
C# Exceptions Handling
C# Exceptions Handling C# Exceptions Handling
C# Exceptions Handling
 
CLASSES AND OBJECTS IN C++ +2 COMPUTER SCIENCE
CLASSES AND OBJECTS IN C++ +2 COMPUTER SCIENCECLASSES AND OBJECTS IN C++ +2 COMPUTER SCIENCE
CLASSES AND OBJECTS IN C++ +2 COMPUTER SCIENCE
 
Utilizing kotlin flows in an android application
Utilizing kotlin flows in an android applicationUtilizing kotlin flows in an android application
Utilizing kotlin flows in an android application
 
File handling & regular expressions in python programming
File handling & regular expressions in python programmingFile handling & regular expressions in python programming
File handling & regular expressions in python programming
 
Guía De Ejercicios Programación Web Básica
Guía De Ejercicios Programación Web BásicaGuía De Ejercicios Programación Web Básica
Guía De Ejercicios Programación Web Básica
 
sSCOPE RESOLUTION OPERATOR.pptx
sSCOPE RESOLUTION OPERATOR.pptxsSCOPE RESOLUTION OPERATOR.pptx
sSCOPE RESOLUTION OPERATOR.pptx
 
File handling
File handlingFile handling
File handling
 
File handling
File handlingFile handling
File handling
 
Internal commands of dos
Internal commands of dosInternal commands of dos
Internal commands of dos
 
packages in java & c++
packages in java & c++packages in java & c++
packages in java & c++
 
Python functions
Python functionsPython functions
Python functions
 
Taller: Prueba Unitaria con JUnit en NetBeans
Taller: Prueba Unitaria con JUnit en NetBeansTaller: Prueba Unitaria con JUnit en NetBeans
Taller: Prueba Unitaria con JUnit en NetBeans
 
C# Delegates
C# DelegatesC# Delegates
C# Delegates
 
Complete C programming Language Course
Complete C programming Language CourseComplete C programming Language Course
Complete C programming Language Course
 
JavaScript and jQuery - Web Technologies (1019888BNR)
JavaScript and jQuery - Web Technologies (1019888BNR)JavaScript and jQuery - Web Technologies (1019888BNR)
JavaScript and jQuery - Web Technologies (1019888BNR)
 

Similar a Tutorial consumir DLL C++ en 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 Tutorial consumir DLL C++ en 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

How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.FlorenciaCattelani
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxFederico Castellari
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...JohnRamos830530
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosJhonJairoRodriguezCe
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIhmpuellon
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21mariacbr99
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxJorgeParada26
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativanicho110
 

Último (11)

How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 

Tutorial consumir DLL C++ en 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…