SlideShare una empresa de Scribd logo
Platform Invocation Services
P/Invoke
Juan Ramírez (@ichramm)@NETUYMeetup
● Intro con dibujito
● Qué es? Qué hace? Para qué sirve?
● Analizando el problema
○ P/Invoke vs C++/CLI
● DllImport y sus allegados
● Data Marshalling
○ Data Types
○ Estructuras
○ Callbacks
Agenda
Quées?Quehace?Paraquésirve?
● Es una funcionalidad del CLR ...
… que permite invocar código nativo
(unmanaged) desde .Net (managed).
● Es muy flexible, y con defaults razonables.
DLL
Common Language
Runtime
Managed
source
code
DLL Function
Unmanaged Managed
Assembly
Metadata
MSIL code
DLL Function
DLL Function
P/Invoke Compiler
“Permite ejecutar native code desde managed code”
PARA QUÉ
SIRVE?
y...
Problema
● Se desea utilizar cierta API nativa, que no
tiene bindings para .Net.
● Debe ser Portable.
● No se dispone del código fuente de la
librería.
Ejemplos(pococoncretos)
● API de Windows
● Librería que implementa determinado
protocolo.
● Interoperabilidad con distintos frameworks
YquépasaconC++/CLI?
● Crear un wrapper sería más sencillo. ✓
● Buena performance, mejor que P/Invoke en
algunos casos. ✓
● Estáticamente type-safe. ✓
● Transiciones entre managed y unmanaged
son sencillas y seguras. ✓
YquépasaconC++/CLI?
● No es portable (solo Windows). ✘
● Se necesita el código fuente de la librería. ✘
● Hay que tocar otro lenguaje, una especie de
C++ maquillado. ✘
YconP/Invoke?
● Solo necesito la DLL. ✓
● Es portable (mono project). ✓
● Solo tengo que tocar C#. ✓
Peeeero...
● No es type-safe. ✘
● Más lento en ciertos casos. ✘
● Se puede volver muy complicado. ✘
Enresumen
● Es la solución a un problema
● Permite utilizar funcionalidades que de otra
manera no se podrían utilizar.
GETTING
BUSINESSTO
DOWN
Basta de cháchara...
Ejemplo
// Usage:
bool copied = CopyFile(textBox1.Text, textBox2.Text, true);
using System.Runtime.InteropServices;
[DllImport("kernel32.dll")]
private static extern bool CopyFile (
string lpExistingFileName,
string lpNewFileName,
bool bFailIfExists
);
● Indica que el método es expuesto por una DLL
nativa (class DllImportAttribute).
/- DllImport
● El keyword extern indica que el método está
implementado en otro lado.
● En nuestro ejemplo:
○ Dll Nativa: kernel32.dll
○ Función : CopyFile
Ejemplo
[DllImport("kernel32.dll",
CharSet = CharSet.Unicode)]
private static extern bool CopyFile (
[MarshalAs(UnmanagedType.LPWStr)] string lpExistingFileName,
[MarshalAs(UnmanagedType.LPWStr)] string lpNewFileName,
bool bFailIfExists
);
// Usage:
bool copied = CopyFile(textBox1.Text, textBox2.Text, true);
/-CharSet
● Marshalling de strings
○ Charset.Ansi -> char*
○ Charset.Unicode -> wchar_t*
● Name matching
○ Charset.Ansi -> CopyFileA
○ Charset.Unicode -> CopyFileW
Ejemplo
[DllImport("kernel32.dll",
CharSet = CharSet.Unicode,
ExactSpelling = true)]
private static extern bool CopyFile (
[MarshalAs(UnmanagedType.LPWStr)] string lpExistingFileName,
[MarshalAs(UnmanagedType.LPWStr)] string lpNewFileName,
bool bFailIfExists
);
/-CharSet vs ExactSpelling
● ExactSpelling deshabilita name matching.
● La función CopyFile no existe en
kernel32.dll.
● Sí existen CopyFileA y CopyFileW
[DllImport("kernel32.dll",
CharSet = CharSet.Unicode,
ExactSpelling = true)]
private static extern bool CopyFileW (
[MarshalAs(UnmanagedType.LPWStr)] string lpExistingFileName,
[MarshalAs(UnmanagedType.LPWStr)] string lpNewFileName,
bool bFailIfExists
);
/-CharSet vs ExactSpelling
Posible solución
Ejemplo
[DllImport("kernel32.dll",
CharSet = CharSet.Unicode,
SetLastError = true, // This function sets last error
CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool CopyFile (
[MarshalAs(UnmanagedType.LPWStr)] string lpExistingFileName,
[MarshalAs(UnmanagedType.LPWStr)] string lpNewFileName,
[MarshalAs(UnmanagedType.Bool)] bool bFailIfExists
);
Ejemplo
[DllImport("kernel32.dll",
CharSet = CharSet.Unicode,
SetLastError = true, // This function sets last error
CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool CopyFile (
[MarshalAs(UnmanagedType.LPWStr)] string lpExistingFileName,
[MarshalAs(UnmanagedType.LPWStr)] string lpNewFileName,
[MarshalAs(UnmanagedType.Bool)] bool bFailIfExists
);
/-CallingConvention
● Esquema que establece como una función recibe
parámetros y devuelve un resultado.
● El código necesario lo genera el propio compilador
(C/C++).
● El default en .Net es Winapi (StdCall).
● “... quien limpia el stack”.
/-CallingConvention
StdCall
● El callee limpia el
stack.
● Default en el
Windows API.
Cdecl
● El caller limpia el
stack.
● Default en Visual
C++.
Ejemplo
[DllImport("kernel32.dll",
CharSet = CharSet.Unicode,
SetLastError = true,
CallingConvention = CallingConvention.StdCall,
EntryPoint = "CopyFile")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool NativeCopyFile (
[MarshalAs(UnmanagedType.LPWStr)] string lpExistingFileName,
[MarshalAs(UnmanagedType.LPWStr)] string lpNewFileName,
[MarshalAs(UnmanagedType.Bool)] bool bFailIfExists
);
/-EntryPoint
● Especifica el nombre con el que se va a buscar
la función.
● O el índice de la función dentro de la DLL .
○ Ej: EntryPoint = "#167"
● El default es el nombre del método marcado
con el DllImport.
Ejemplo
void CopyFile(string from, string to)
{
bool copied = NativeCopyFile(from, to, true);
if (copied == false)
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
}
LOCOS
EJEMPLITOS
DOS
> git checkout example1
> git checkout example2
● Se trata de una especie de transformación
de datos.
● Desde el mundo managed al mundo
nativo.
● Desde el mundo nativo al mundo
managed.
DataMarshaling
Para cada data type de .net existe un data type
unmanaged por defecto.
● int -> int
● bool -> BOOL /ojo! son 4 bytes
● string -> char * (o TCHAR)
● etc
DataMarshaling/DataTypes
DataMarshaling/DataTypes/System.IntPtr
● Se utiliza para representar punteros (o
handles).
● IntPtr es ideal para tipos opacos.
● Es platform-specific (x86, x64).
Ejemplo
[DllImport("kernel32.dll")]
public static extern IntPtr OpenMutex(
uint dwDesiredAccess, bool bInheritHandle, string lpName
);
// typedef void * HANDLE; -> winnt.h
HANDLE WINAPI OpenMutex(
DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName
);
DataMarshaling/DataTypes/ System.String
● Ya vimos como pasar strings desde el
mundo managed al mundo unmanaged.
● Vamos a ver como se hace al revés.
DWORD WINAPI GetModuleFileName(
HMODULE hModule, LPTSTR lpFilename, DWORD nSize
);
[DllImport("kernel32.dll")]
public static extern uint GetModuleFileName(
IntPtr hModule,
// System.String is not mutable
StringBuilder lpFilename,
[MarshalAs(UnmanagedType.U4)] int nSize
);
DataMarshaling/DataTypes/ System.String
Ejemplo
public string StartupPath {
get {
StringBuilder sb = new StringBuilder(260);
GetModuleFileName(IntPtr.Zero, sb, sb.Capacity);
// TODO: Handle error
return sb.ToString();
}
}
EJEMPLITO
OTRO
> git checkout example3
● Se debe especificar el layout
● Members pueden llevar atributos
DataMarshaling/Structs
[StructLayout(LayoutKind.Sequential)]
public class LOGFONT {
// members...
[MarshalAs(UnmanagedType.ByValTStr,
SizeConst = LF_FACESIZE)]
public string lfFaceName;
● El layout se puede configurar explícitamente
[StructLayout(LayoutKind.Explicit)]
public class LOGFONT {
[FieldOffset(0)] public int lfHeight;
// more members…
}
DataMarshaling/Structs
● Cual es el tamaño de este struct?
public struct Test {
public byte a;
public int b;
public short c;
public byte d;
}
DataMarshaling/Structs
● Ojo con el padding!!
12
JUMP!
> git checkout example4
● Mapean directo con delegates
DataMarshaling/Callbacks
● Mismas reglas que con las demas
funciones.
● Una forma de llamar funciones de .Net
desde el mundo unmanaged.
Ejemplo
ESME_HANDLE SMPP_API libSMPP_ClientCreate (
OnIncomingMessageCallback onNewMessage
);
Ejemplo
typedef void (*OnIncomingMessageCallback)(
ESME_HANDLE hClient,
const char* from,
const char* to,
const char* content, // UTF-8
unsigned int size
);
Ejemplo
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void IncomingMessageHandler(
IntPtr hClient,
string from,
string to,
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)]
byte[] content,
[MarshalAs(UnmanagedType.U4)] int bufferSize
);
Ejemplo
[DllImport("inconcertsmpp.dll"
, CharSet = CharSet.Ansi
, CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr libSMPP_ClientCreate(
[MarshalAs(UnmanagedType.FunctionPtr)]
IncomingMessageHandler onNewMessage
);
hClient = libSMPP_ClientCreate(
new IncomingMessageHandler( delegate(
IntPtr hClient, string from, string to,
byte[] content, int bufferSize)
{
string text = Encoding.UTF8.GetString(content);
// ...
}
);
Ejemplo
Pero...
● Ese código vuela por los aires
● El garbage collector se lleva el delegate
● Hay que mantener vivas las referencias a
esos elementos
m_handler = new IncomingMessageHandler( delegate(
IntPtr hClient, string from, string to,
byte[] content, int bufferSize)
{
string text = Encoding.UTF8.GetString(content);
// ...
};
hClient = libSMPP_ClientCreate(m_handler);
Ejemplo
Gracias!
Didn’t make it:
● Keywords: unsafe, fixed
● Custom Marshallers
● Punteros

Más contenido relacionado

La actualidad más candente

Operadores poo
Operadores pooOperadores poo
Operadores poo
RochaJaqueline
 
03 java poo_parte_2
03 java poo_parte_203 java poo_parte_2
03 java poo_parte_2
Renny Batista
 
Semana 6 Módulos Clases y Objetos
Semana 6   Módulos Clases y ObjetosSemana 6   Módulos Clases y Objetos
Semana 6 Módulos Clases y Objetos
Richard Eliseo Mendoza Gafaro
 
Programación 3: Clases y objetos en Java
Programación 3: Clases y objetos en JavaProgramación 3: Clases y objetos en Java
Programación 3: Clases y objetos en Java
Angel Vázquez Patiño
 
16 17 tecnologias python oop
16 17 tecnologias python oop16 17 tecnologias python oop
16 17 tecnologias python oopSoftware Guru
 
Programación Orientada a Objetos para Python
Programación Orientada a Objetos para PythonProgramación Orientada a Objetos para Python
Programación Orientada a Objetos para Python
José Luis Chiquete Valdivieso
 
Programación 1: modularización
Programación 1: modularizaciónProgramación 1: modularización
Programación 1: modularización
Angel Vázquez Patiño
 
Presentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubPresentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic Club
GlobalLogic Latinoamérica
 
Programación 3: clases derivadas y polimorfismo
Programación 3: clases derivadas y polimorfismoProgramación 3: clases derivadas y polimorfismo
Programación 3: clases derivadas y polimorfismo
Angel Vázquez Patiño
 
Metodos Get y Set, finalmente revelados.
Metodos Get y Set, finalmente revelados.Metodos Get y Set, finalmente revelados.
Metodos Get y Set, finalmente revelados.
Juan Carlos Espinoza
 
Constructores en java(grupo 8)
Constructores en java(grupo 8)Constructores en java(grupo 8)
Constructores en java(grupo 8)Manuel Ch.
 
Programación Orientada a Objetos - constructores y destructores
Programación Orientada a Objetos - constructores y destructoresProgramación Orientada a Objetos - constructores y destructores
Programación Orientada a Objetos - constructores y destructores
Alvaro Enrique Ruano
 
9 Curso de POO en java - variables, constantes y objetos
9 Curso de POO en java - variables, constantes y objetos9 Curso de POO en java - variables, constantes y objetos
9 Curso de POO en java - variables, constantes y objetos
Clara Patricia Avella Ibañez
 
Fundamentos POO en JS. Mixins y Traits.
Fundamentos POO en JS. Mixins y Traits.Fundamentos POO en JS. Mixins y Traits.
Fundamentos POO en JS. Mixins y Traits.
Maximiliano Fierro
 
Clases y objetos
Clases y objetosClases y objetos
Clases y objetos
Eduardo García
 
Cuestionario
CuestionarioCuestionario
Cuestionario
Leonardo Moctezuma
 
Programacion Orientada a Objetos
Programacion Orientada a ObjetosProgramacion Orientada a Objetos
Programacion Orientada a Objetos
Cesar David Fernandez Grueso
 

La actualidad más candente (19)

Operadores poo
Operadores pooOperadores poo
Operadores poo
 
03 java poo_parte_2
03 java poo_parte_203 java poo_parte_2
03 java poo_parte_2
 
Aprendiendo objetos en c++
Aprendiendo objetos en c++Aprendiendo objetos en c++
Aprendiendo objetos en c++
 
Presentacion5
Presentacion5Presentacion5
Presentacion5
 
Semana 6 Módulos Clases y Objetos
Semana 6   Módulos Clases y ObjetosSemana 6   Módulos Clases y Objetos
Semana 6 Módulos Clases y Objetos
 
Programación 3: Clases y objetos en Java
Programación 3: Clases y objetos en JavaProgramación 3: Clases y objetos en Java
Programación 3: Clases y objetos en Java
 
16 17 tecnologias python oop
16 17 tecnologias python oop16 17 tecnologias python oop
16 17 tecnologias python oop
 
Programación Orientada a Objetos para Python
Programación Orientada a Objetos para PythonProgramación Orientada a Objetos para Python
Programación Orientada a Objetos para Python
 
Programación 1: modularización
Programación 1: modularizaciónProgramación 1: modularización
Programación 1: modularización
 
Presentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubPresentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic Club
 
Programación 3: clases derivadas y polimorfismo
Programación 3: clases derivadas y polimorfismoProgramación 3: clases derivadas y polimorfismo
Programación 3: clases derivadas y polimorfismo
 
Metodos Get y Set, finalmente revelados.
Metodos Get y Set, finalmente revelados.Metodos Get y Set, finalmente revelados.
Metodos Get y Set, finalmente revelados.
 
Constructores en java(grupo 8)
Constructores en java(grupo 8)Constructores en java(grupo 8)
Constructores en java(grupo 8)
 
Programación Orientada a Objetos - constructores y destructores
Programación Orientada a Objetos - constructores y destructoresProgramación Orientada a Objetos - constructores y destructores
Programación Orientada a Objetos - constructores y destructores
 
9 Curso de POO en java - variables, constantes y objetos
9 Curso de POO en java - variables, constantes y objetos9 Curso de POO en java - variables, constantes y objetos
9 Curso de POO en java - variables, constantes y objetos
 
Fundamentos POO en JS. Mixins y Traits.
Fundamentos POO en JS. Mixins y Traits.Fundamentos POO en JS. Mixins y Traits.
Fundamentos POO en JS. Mixins y Traits.
 
Clases y objetos
Clases y objetosClases y objetos
Clases y objetos
 
Cuestionario
CuestionarioCuestionario
Cuestionario
 
Programacion Orientada a Objetos
Programacion Orientada a ObjetosProgramacion Orientada a Objetos
Programacion Orientada a Objetos
 

Destacado

Youthless presentation
Youthless presentationYouthless presentation
Youthless presentation
Jose González Diaz
 
COMEMOS QUÍMICA: Viaje al interior de los alimentos
COMEMOS QUÍMICA: Viaje al interior de los alimentosCOMEMOS QUÍMICA: Viaje al interior de los alimentos
COMEMOS QUÍMICA: Viaje al interior de los alimentos
CIEN Austral
 
Presentation open glam_juni2015_htw_alumni_event_20150612
Presentation open glam_juni2015_htw_alumni_event_20150612Presentation open glam_juni2015_htw_alumni_event_20150612
Presentation open glam_juni2015_htw_alumni_event_20150612
Beat Estermann
 
Osobní bezpečnost na internetu
Osobní bezpečnost na internetuOsobní bezpečnost na internetu
Osobní bezpečnost na internetu
DCIT, a.s.
 
Repic side event lausanne 2012
Repic side event lausanne 2012Repic side event lausanne 2012
Repic side event lausanne 2012Raffaelo
 
Ce Annual Report Final
Ce Annual Report FinalCe Annual Report Final
Ce Annual Report Final
cespi003
 
Ninez guatemalteca en_cifras
Ninez guatemalteca en_cifrasNinez guatemalteca en_cifras
Ninez guatemalteca en_cifras
primoyo
 
Cerrajeros Murcia de urgencia
Cerrajeros Murcia de urgenciaCerrajeros Murcia de urgencia
Cerrajeros Murcia de urgencia
cerrajerosmurcia04
 
N 20150503 don jose manuel feito - miranda
N 20150503  don jose manuel feito - mirandaN 20150503  don jose manuel feito - miranda
N 20150503 don jose manuel feito - mirandarubindecelis32
 
MPI Presentation on Gameification DeMarle
MPI Presentation on Gameification DeMarleMPI Presentation on Gameification DeMarle
MPI Presentation on Gameification DeMarle
Ann DeMarle
 
Redes sociales para niños
Redes sociales para niñosRedes sociales para niños
Redes sociales para niñosAnnie Lopez
 
The Work Ahead: The Future of Business and Jobs in Asia Pacific's Digital Eco...
The Work Ahead: The Future of Business and Jobs in Asia Pacific's Digital Eco...The Work Ahead: The Future of Business and Jobs in Asia Pacific's Digital Eco...
The Work Ahead: The Future of Business and Jobs in Asia Pacific's Digital Eco...
Cognizant
 
IP NETWORKS
IP NETWORKSIP NETWORKS
IP NETWORKS
Kathirvel Ayyaswamy
 
La tintorería en el 2010
La tintorería en el 2010La tintorería en el 2010
La tintorería en el 2010
Gemma Martin Gómez
 
Venus the Beautiful Planet
Venus the Beautiful PlanetVenus the Beautiful Planet
Venus the Beautiful Planet
MacLean School
 
Solubilidad de los disolventes con los plasticos 1
Solubilidad de los disolventes con los plasticos 1Solubilidad de los disolventes con los plasticos 1
Solubilidad de los disolventes con los plasticos 1
Maura Judith Cruz Cari
 
ZOOM International Overview
ZOOM International OverviewZOOM International Overview
ZOOM International Overviewbshore1998
 

Destacado (20)

Youthless presentation
Youthless presentationYouthless presentation
Youthless presentation
 
COMEMOS QUÍMICA: Viaje al interior de los alimentos
COMEMOS QUÍMICA: Viaje al interior de los alimentosCOMEMOS QUÍMICA: Viaje al interior de los alimentos
COMEMOS QUÍMICA: Viaje al interior de los alimentos
 
Proyeto aplicación
Proyeto aplicaciónProyeto aplicación
Proyeto aplicación
 
Presentation open glam_juni2015_htw_alumni_event_20150612
Presentation open glam_juni2015_htw_alumni_event_20150612Presentation open glam_juni2015_htw_alumni_event_20150612
Presentation open glam_juni2015_htw_alumni_event_20150612
 
Osobní bezpečnost na internetu
Osobní bezpečnost na internetuOsobní bezpečnost na internetu
Osobní bezpečnost na internetu
 
Repic side event lausanne 2012
Repic side event lausanne 2012Repic side event lausanne 2012
Repic side event lausanne 2012
 
Ce Annual Report Final
Ce Annual Report FinalCe Annual Report Final
Ce Annual Report Final
 
L.N. Shethy Resume
L.N. Shethy ResumeL.N. Shethy Resume
L.N. Shethy Resume
 
Ninez guatemalteca en_cifras
Ninez guatemalteca en_cifrasNinez guatemalteca en_cifras
Ninez guatemalteca en_cifras
 
Cerrajeros Murcia de urgencia
Cerrajeros Murcia de urgenciaCerrajeros Murcia de urgencia
Cerrajeros Murcia de urgencia
 
N 20150503 don jose manuel feito - miranda
N 20150503  don jose manuel feito - mirandaN 20150503  don jose manuel feito - miranda
N 20150503 don jose manuel feito - miranda
 
MPI Presentation on Gameification DeMarle
MPI Presentation on Gameification DeMarleMPI Presentation on Gameification DeMarle
MPI Presentation on Gameification DeMarle
 
Redes sociales para niños
Redes sociales para niñosRedes sociales para niños
Redes sociales para niños
 
The Work Ahead: The Future of Business and Jobs in Asia Pacific's Digital Eco...
The Work Ahead: The Future of Business and Jobs in Asia Pacific's Digital Eco...The Work Ahead: The Future of Business and Jobs in Asia Pacific's Digital Eco...
The Work Ahead: The Future of Business and Jobs in Asia Pacific's Digital Eco...
 
IP NETWORKS
IP NETWORKSIP NETWORKS
IP NETWORKS
 
La tintorería en el 2010
La tintorería en el 2010La tintorería en el 2010
La tintorería en el 2010
 
Capitulo 76
Capitulo 76Capitulo 76
Capitulo 76
 
Venus the Beautiful Planet
Venus the Beautiful PlanetVenus the Beautiful Planet
Venus the Beautiful Planet
 
Solubilidad de los disolventes con los plasticos 1
Solubilidad de los disolventes con los plasticos 1Solubilidad de los disolventes con los plasticos 1
Solubilidad de los disolventes con los plasticos 1
 
ZOOM International Overview
ZOOM International OverviewZOOM International Overview
ZOOM International Overview
 

Similar a .NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez

Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_
Maztherprozh
 
Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)
Maztherprozh
 
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...jaircazarin
 
Java8 : Más allá de las Expresiones Lambdas
Java8 :  Más allá de las Expresiones LambdasJava8 :  Más allá de las Expresiones Lambdas
Java8 : Más allá de las Expresiones Lambdas
Eudris Cabrera
 
Java 8 - Nuevas características
Java 8 - Nuevas característicasJava 8 - Nuevas características
Java 8 - Nuevas características
Fernando Petrola
 
C++
C++C++
Cplus
CplusCplus
Estructura basica para_c_
Estructura basica para_c_Estructura basica para_c_
Estructura basica para_c_
HUGOJAREDSANCHEZMARTINEZ
 
Programación en c++
Programación en c++Programación en c++
Programación en c++
andermijan
 
Curso C Ii
Curso C IiCurso C Ii
Curso C Iiyuli
 
JAVA.PPT
JAVA.PPTJAVA.PPT
JAVA.PPT
GalvanGR
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
DanielHidalgo92
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
miguel checa
 
TUTORIAL JAVA
TUTORIAL JAVATUTORIAL JAVA
TUTORIAL JAVA
denis ticona condori
 
Lenguajes de Programación: Clases y objetos
Lenguajes de Programación: Clases y objetosLenguajes de Programación: Clases y objetos
Lenguajes de Programación: Clases y objetos
Luis Fernando Aguas Bucheli
 

Similar a .NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez (20)

Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_
 
Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)
 
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
 
Introducción a Python
Introducción a PythonIntroducción a Python
Introducción a Python
 
Java8 : Más allá de las Expresiones Lambdas
Java8 :  Más allá de las Expresiones LambdasJava8 :  Más allá de las Expresiones Lambdas
Java8 : Más allá de las Expresiones Lambdas
 
Java 8 - Nuevas características
Java 8 - Nuevas característicasJava 8 - Nuevas características
Java 8 - Nuevas características
 
C++
C++C++
C++
 
Programación en c++
Programación en c++Programación en c++
Programación en c++
 
Cplus
CplusCplus
Cplus
 
Java 8
Java 8Java 8
Java 8
 
Estructura basica para_c_
Estructura basica para_c_Estructura basica para_c_
Estructura basica para_c_
 
Programación en c++
Programación en c++Programación en c++
Programación en c++
 
Curso c ii
Curso c iiCurso c ii
Curso c ii
 
Curso C Ii
Curso C IiCurso C Ii
Curso C Ii
 
JAVA.PPT
JAVA.PPTJAVA.PPT
JAVA.PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
TUTORIAL JAVA
TUTORIAL JAVATUTORIAL JAVA
TUTORIAL JAVA
 
Turbo c
Turbo cTurbo c
Turbo c
 
Lenguajes de Programación: Clases y objetos
Lenguajes de Programación: Clases y objetosLenguajes de Programación: Clases y objetos
Lenguajes de Programación: Clases y objetos
 

Más de .NET UY Meetup

.NET UY Meetup 7 - ICBanking Apps by Gonzalo Pelós & Gabriel Monteagudo
.NET UY Meetup 7 - ICBanking Apps by Gonzalo Pelós & Gabriel Monteagudo.NET UY Meetup 7 - ICBanking Apps by Gonzalo Pelós & Gabriel Monteagudo
.NET UY Meetup 7 - ICBanking Apps by Gonzalo Pelós & Gabriel Monteagudo
.NET UY Meetup
 
.NET UY Meetup 7 - CLR Memory by Fabian Alves
.NET UY Meetup 7 - CLR Memory by Fabian Alves.NET UY Meetup 7 - CLR Memory by Fabian Alves
.NET UY Meetup 7 - CLR Memory by Fabian Alves
.NET UY Meetup
 
.NET UY Meetup 6 - Xamarin: Desarrollando apps nativas para iOS & Android en ...
.NET UY Meetup 6 - Xamarin: Desarrollando apps nativas para iOS & Android en ....NET UY Meetup 6 - Xamarin: Desarrollando apps nativas para iOS & Android en ...
.NET UY Meetup 6 - Xamarin: Desarrollando apps nativas para iOS & Android en ....NET UY Meetup
 
.NET UY Meetup 5 - MVC For Human Beings by Leonardo Botta
.NET UY Meetup 5 - MVC For Human Beings by Leonardo Botta.NET UY Meetup 5 - MVC For Human Beings by Leonardo Botta
.NET UY Meetup 5 - MVC For Human Beings by Leonardo Botta
.NET UY Meetup
 
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez.NET UY Meetup
 
.NET UY Meetup 4 - Windows 8: Lecciones Aprendidas by Alvaro Regalado & Leona...
.NET UY Meetup 4 - Windows 8: Lecciones Aprendidas by Alvaro Regalado & Leona....NET UY Meetup 4 - Windows 8: Lecciones Aprendidas by Alvaro Regalado & Leona...
.NET UY Meetup 4 - Windows 8: Lecciones Aprendidas by Alvaro Regalado & Leona...
.NET UY Meetup
 
.NET UY Meetup 3 - El Poder de la Visión by Ariel Erlijman
.NET UY Meetup 3 - El Poder de la Visión by Ariel Erlijman.NET UY Meetup 3 - El Poder de la Visión by Ariel Erlijman
.NET UY Meetup 3 - El Poder de la Visión by Ariel Erlijman
.NET UY Meetup
 
.NET UY Meetup 3 - Presentaciones Efectivas by Ariel Erlijman
.NET UY Meetup 3 - Presentaciones Efectivas by Ariel Erlijman.NET UY Meetup 3 - Presentaciones Efectivas by Ariel Erlijman
.NET UY Meetup 3 - Presentaciones Efectivas by Ariel Erlijman
.NET UY Meetup
 

Más de .NET UY Meetup (8)

.NET UY Meetup 7 - ICBanking Apps by Gonzalo Pelós & Gabriel Monteagudo
.NET UY Meetup 7 - ICBanking Apps by Gonzalo Pelós & Gabriel Monteagudo.NET UY Meetup 7 - ICBanking Apps by Gonzalo Pelós & Gabriel Monteagudo
.NET UY Meetup 7 - ICBanking Apps by Gonzalo Pelós & Gabriel Monteagudo
 
.NET UY Meetup 7 - CLR Memory by Fabian Alves
.NET UY Meetup 7 - CLR Memory by Fabian Alves.NET UY Meetup 7 - CLR Memory by Fabian Alves
.NET UY Meetup 7 - CLR Memory by Fabian Alves
 
.NET UY Meetup 6 - Xamarin: Desarrollando apps nativas para iOS & Android en ...
.NET UY Meetup 6 - Xamarin: Desarrollando apps nativas para iOS & Android en ....NET UY Meetup 6 - Xamarin: Desarrollando apps nativas para iOS & Android en ...
.NET UY Meetup 6 - Xamarin: Desarrollando apps nativas para iOS & Android en ...
 
.NET UY Meetup 5 - MVC For Human Beings by Leonardo Botta
.NET UY Meetup 5 - MVC For Human Beings by Leonardo Botta.NET UY Meetup 5 - MVC For Human Beings by Leonardo Botta
.NET UY Meetup 5 - MVC For Human Beings by Leonardo Botta
 
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
 
.NET UY Meetup 4 - Windows 8: Lecciones Aprendidas by Alvaro Regalado & Leona...
.NET UY Meetup 4 - Windows 8: Lecciones Aprendidas by Alvaro Regalado & Leona....NET UY Meetup 4 - Windows 8: Lecciones Aprendidas by Alvaro Regalado & Leona...
.NET UY Meetup 4 - Windows 8: Lecciones Aprendidas by Alvaro Regalado & Leona...
 
.NET UY Meetup 3 - El Poder de la Visión by Ariel Erlijman
.NET UY Meetup 3 - El Poder de la Visión by Ariel Erlijman.NET UY Meetup 3 - El Poder de la Visión by Ariel Erlijman
.NET UY Meetup 3 - El Poder de la Visión by Ariel Erlijman
 
.NET UY Meetup 3 - Presentaciones Efectivas by Ariel Erlijman
.NET UY Meetup 3 - Presentaciones Efectivas by Ariel Erlijman.NET UY Meetup 3 - Presentaciones Efectivas by Ariel Erlijman
.NET UY Meetup 3 - Presentaciones Efectivas by Ariel Erlijman
 

Último

trabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6ftrabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6f
zoecaicedosalazar
 
Alan Turing Vida o biografía resumida como presentación
Alan Turing Vida o biografía resumida como presentaciónAlan Turing Vida o biografía resumida como presentación
Alan Turing Vida o biografía resumida como presentación
JuanPrez962115
 
Estructuras básicas_ conceptos de programación (1).docx
Estructuras básicas_ conceptos de programación  (1).docxEstructuras básicas_ conceptos de programación  (1).docx
Estructuras básicas_ conceptos de programación (1).docx
SamuelRamirez83524
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
cdraco
 
biogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectosbiogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectos
Luis Enrique Zafra Haro
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
Emilio Casbas
 
Posnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaPosnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativa
Fernando Villares
 
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdfEstructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
IsabellaRubio6
 
Conceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. TecnologíaConceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. Tecnología
coloradxmaria
 
Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.
AlejandraCasallas7
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
jjfch3110
 
EduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clasesEduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clases
PABLOCESARGARZONBENI
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
vazquezgarciajesusma
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
JulyMuoz18
 
Estructuras básicas_ conceptos básicos de programación.pdf
Estructuras básicas_  conceptos básicos de programación.pdfEstructuras básicas_  conceptos básicos de programación.pdf
Estructuras básicas_ conceptos básicos de programación.pdf
ItsSofi
 
Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
cofferub
 
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptxleidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
Leidyfuentes19
 
Diagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdfDiagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdf
ManuelCampos464987
 
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfTRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
thomasdcroz38
 
Desarrollo de Habilidades de Pensamiento.docx (3).pdf
Desarrollo de Habilidades de Pensamiento.docx (3).pdfDesarrollo de Habilidades de Pensamiento.docx (3).pdf
Desarrollo de Habilidades de Pensamiento.docx (3).pdf
AlejandraCasallas7
 

Último (20)

trabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6ftrabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6f
 
Alan Turing Vida o biografía resumida como presentación
Alan Turing Vida o biografía resumida como presentaciónAlan Turing Vida o biografía resumida como presentación
Alan Turing Vida o biografía resumida como presentación
 
Estructuras básicas_ conceptos de programación (1).docx
Estructuras básicas_ conceptos de programación  (1).docxEstructuras básicas_ conceptos de programación  (1).docx
Estructuras básicas_ conceptos de programación (1).docx
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
 
biogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectosbiogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectos
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
 
Posnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaPosnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativa
 
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdfEstructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
 
Conceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. TecnologíaConceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. Tecnología
 
Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
 
EduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clasesEduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clases
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
 
Estructuras básicas_ conceptos básicos de programación.pdf
Estructuras básicas_  conceptos básicos de programación.pdfEstructuras básicas_  conceptos básicos de programación.pdf
Estructuras básicas_ conceptos básicos de programación.pdf
 
Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
 
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptxleidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
 
Diagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdfDiagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdf
 
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfTRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
 
Desarrollo de Habilidades de Pensamiento.docx (3).pdf
Desarrollo de Habilidades de Pensamiento.docx (3).pdfDesarrollo de Habilidades de Pensamiento.docx (3).pdf
Desarrollo de Habilidades de Pensamiento.docx (3).pdf
 

.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez

  • 1. Platform Invocation Services P/Invoke Juan Ramírez (@ichramm)@NETUYMeetup
  • 2. ● Intro con dibujito ● Qué es? Qué hace? Para qué sirve? ● Analizando el problema ○ P/Invoke vs C++/CLI ● DllImport y sus allegados ● Data Marshalling ○ Data Types ○ Estructuras ○ Callbacks Agenda
  • 3. Quées?Quehace?Paraquésirve? ● Es una funcionalidad del CLR ... … que permite invocar código nativo (unmanaged) desde .Net (managed). ● Es muy flexible, y con defaults razonables.
  • 4. DLL Common Language Runtime Managed source code DLL Function Unmanaged Managed Assembly Metadata MSIL code DLL Function DLL Function P/Invoke Compiler “Permite ejecutar native code desde managed code”
  • 6. Problema ● Se desea utilizar cierta API nativa, que no tiene bindings para .Net. ● Debe ser Portable. ● No se dispone del código fuente de la librería.
  • 7. Ejemplos(pococoncretos) ● API de Windows ● Librería que implementa determinado protocolo. ● Interoperabilidad con distintos frameworks
  • 8. YquépasaconC++/CLI? ● Crear un wrapper sería más sencillo. ✓ ● Buena performance, mejor que P/Invoke en algunos casos. ✓ ● Estáticamente type-safe. ✓ ● Transiciones entre managed y unmanaged son sencillas y seguras. ✓
  • 9. YquépasaconC++/CLI? ● No es portable (solo Windows). ✘ ● Se necesita el código fuente de la librería. ✘ ● Hay que tocar otro lenguaje, una especie de C++ maquillado. ✘
  • 10. YconP/Invoke? ● Solo necesito la DLL. ✓ ● Es portable (mono project). ✓ ● Solo tengo que tocar C#. ✓
  • 11. Peeeero... ● No es type-safe. ✘ ● Más lento en ciertos casos. ✘ ● Se puede volver muy complicado. ✘
  • 12. Enresumen ● Es la solución a un problema ● Permite utilizar funcionalidades que de otra manera no se podrían utilizar.
  • 14. Ejemplo // Usage: bool copied = CopyFile(textBox1.Text, textBox2.Text, true); using System.Runtime.InteropServices; [DllImport("kernel32.dll")] private static extern bool CopyFile ( string lpExistingFileName, string lpNewFileName, bool bFailIfExists );
  • 15. ● Indica que el método es expuesto por una DLL nativa (class DllImportAttribute). /- DllImport ● El keyword extern indica que el método está implementado en otro lado. ● En nuestro ejemplo: ○ Dll Nativa: kernel32.dll ○ Función : CopyFile
  • 16. Ejemplo [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] private static extern bool CopyFile ( [MarshalAs(UnmanagedType.LPWStr)] string lpExistingFileName, [MarshalAs(UnmanagedType.LPWStr)] string lpNewFileName, bool bFailIfExists ); // Usage: bool copied = CopyFile(textBox1.Text, textBox2.Text, true);
  • 17. /-CharSet ● Marshalling de strings ○ Charset.Ansi -> char* ○ Charset.Unicode -> wchar_t* ● Name matching ○ Charset.Ansi -> CopyFileA ○ Charset.Unicode -> CopyFileW
  • 18. Ejemplo [DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)] private static extern bool CopyFile ( [MarshalAs(UnmanagedType.LPWStr)] string lpExistingFileName, [MarshalAs(UnmanagedType.LPWStr)] string lpNewFileName, bool bFailIfExists );
  • 19. /-CharSet vs ExactSpelling ● ExactSpelling deshabilita name matching. ● La función CopyFile no existe en kernel32.dll. ● Sí existen CopyFileA y CopyFileW
  • 20. [DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)] private static extern bool CopyFileW ( [MarshalAs(UnmanagedType.LPWStr)] string lpExistingFileName, [MarshalAs(UnmanagedType.LPWStr)] string lpNewFileName, bool bFailIfExists ); /-CharSet vs ExactSpelling Posible solución
  • 21. Ejemplo [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true, // This function sets last error CallingConvention = CallingConvention.Cdecl)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool CopyFile ( [MarshalAs(UnmanagedType.LPWStr)] string lpExistingFileName, [MarshalAs(UnmanagedType.LPWStr)] string lpNewFileName, [MarshalAs(UnmanagedType.Bool)] bool bFailIfExists );
  • 22. Ejemplo [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true, // This function sets last error CallingConvention = CallingConvention.StdCall)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool CopyFile ( [MarshalAs(UnmanagedType.LPWStr)] string lpExistingFileName, [MarshalAs(UnmanagedType.LPWStr)] string lpNewFileName, [MarshalAs(UnmanagedType.Bool)] bool bFailIfExists );
  • 23. /-CallingConvention ● Esquema que establece como una función recibe parámetros y devuelve un resultado. ● El código necesario lo genera el propio compilador (C/C++). ● El default en .Net es Winapi (StdCall). ● “... quien limpia el stack”.
  • 24. /-CallingConvention StdCall ● El callee limpia el stack. ● Default en el Windows API. Cdecl ● El caller limpia el stack. ● Default en Visual C++.
  • 25. Ejemplo [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true, CallingConvention = CallingConvention.StdCall, EntryPoint = "CopyFile")] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool NativeCopyFile ( [MarshalAs(UnmanagedType.LPWStr)] string lpExistingFileName, [MarshalAs(UnmanagedType.LPWStr)] string lpNewFileName, [MarshalAs(UnmanagedType.Bool)] bool bFailIfExists );
  • 26. /-EntryPoint ● Especifica el nombre con el que se va a buscar la función. ● O el índice de la función dentro de la DLL . ○ Ej: EntryPoint = "#167" ● El default es el nombre del método marcado con el DllImport.
  • 27. Ejemplo void CopyFile(string from, string to) { bool copied = NativeCopyFile(from, to, true); if (copied == false) { throw new Win32Exception(Marshal.GetLastWin32Error()); } }
  • 28. LOCOS EJEMPLITOS DOS > git checkout example1 > git checkout example2
  • 29. ● Se trata de una especie de transformación de datos. ● Desde el mundo managed al mundo nativo. ● Desde el mundo nativo al mundo managed. DataMarshaling
  • 30. Para cada data type de .net existe un data type unmanaged por defecto. ● int -> int ● bool -> BOOL /ojo! son 4 bytes ● string -> char * (o TCHAR) ● etc DataMarshaling/DataTypes
  • 31. DataMarshaling/DataTypes/System.IntPtr ● Se utiliza para representar punteros (o handles). ● IntPtr es ideal para tipos opacos. ● Es platform-specific (x86, x64).
  • 32. Ejemplo [DllImport("kernel32.dll")] public static extern IntPtr OpenMutex( uint dwDesiredAccess, bool bInheritHandle, string lpName ); // typedef void * HANDLE; -> winnt.h HANDLE WINAPI OpenMutex( DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName );
  • 33. DataMarshaling/DataTypes/ System.String ● Ya vimos como pasar strings desde el mundo managed al mundo unmanaged. ● Vamos a ver como se hace al revés.
  • 34. DWORD WINAPI GetModuleFileName( HMODULE hModule, LPTSTR lpFilename, DWORD nSize ); [DllImport("kernel32.dll")] public static extern uint GetModuleFileName( IntPtr hModule, // System.String is not mutable StringBuilder lpFilename, [MarshalAs(UnmanagedType.U4)] int nSize ); DataMarshaling/DataTypes/ System.String
  • 35. Ejemplo public string StartupPath { get { StringBuilder sb = new StringBuilder(260); GetModuleFileName(IntPtr.Zero, sb, sb.Capacity); // TODO: Handle error return sb.ToString(); } }
  • 37. ● Se debe especificar el layout ● Members pueden llevar atributos DataMarshaling/Structs [StructLayout(LayoutKind.Sequential)] public class LOGFONT { // members... [MarshalAs(UnmanagedType.ByValTStr, SizeConst = LF_FACESIZE)] public string lfFaceName;
  • 38. ● El layout se puede configurar explícitamente [StructLayout(LayoutKind.Explicit)] public class LOGFONT { [FieldOffset(0)] public int lfHeight; // more members… } DataMarshaling/Structs
  • 39. ● Cual es el tamaño de este struct? public struct Test { public byte a; public int b; public short c; public byte d; } DataMarshaling/Structs ● Ojo con el padding!! 12
  • 41. ● Mapean directo con delegates DataMarshaling/Callbacks ● Mismas reglas que con las demas funciones. ● Una forma de llamar funciones de .Net desde el mundo unmanaged.
  • 42. Ejemplo ESME_HANDLE SMPP_API libSMPP_ClientCreate ( OnIncomingMessageCallback onNewMessage );
  • 43. Ejemplo typedef void (*OnIncomingMessageCallback)( ESME_HANDLE hClient, const char* from, const char* to, const char* content, // UTF-8 unsigned int size );
  • 44. Ejemplo [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate void IncomingMessageHandler( IntPtr hClient, string from, string to, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] byte[] content, [MarshalAs(UnmanagedType.U4)] int bufferSize );
  • 45. Ejemplo [DllImport("inconcertsmpp.dll" , CharSet = CharSet.Ansi , CallingConvention = CallingConvention.Cdecl)] static extern IntPtr libSMPP_ClientCreate( [MarshalAs(UnmanagedType.FunctionPtr)] IncomingMessageHandler onNewMessage );
  • 46. hClient = libSMPP_ClientCreate( new IncomingMessageHandler( delegate( IntPtr hClient, string from, string to, byte[] content, int bufferSize) { string text = Encoding.UTF8.GetString(content); // ... } ); Ejemplo
  • 47. Pero... ● Ese código vuela por los aires ● El garbage collector se lleva el delegate ● Hay que mantener vivas las referencias a esos elementos
  • 48. m_handler = new IncomingMessageHandler( delegate( IntPtr hClient, string from, string to, byte[] content, int bufferSize) { string text = Encoding.UTF8.GetString(content); // ... }; hClient = libSMPP_ClientCreate(m_handler); Ejemplo
  • 49. Gracias! Didn’t make it: ● Keywords: unsafe, fixed ● Custom Marshallers ● Punteros