Fundamentos de interoperabilidad (P/Invoke) de un vistazo
Llame a funciones nativas con P/Invoke: fundamentos de DllImport, marshaling de strings, SetLastError y demostraciones sencillas de Win32 (Sleep, GetTickCount64).
Fundamentos de interoperabilidad (P/Invoke) de un vistazo es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 2 de 3. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 3 lecciones en total.
Concepto y objetivos
P/Invoke permite que C# llame a funciones de DLL nativas.
- Use DllImport para vincular un método
- Elija CharSet y SetLastError cuando sea necesario
- Mantenga las firmas sencillas y precisas
P/Invoke: Sleep
Vincule la función nativa declarando un método administrado con DllImport.
using System;
using System.Runtime.InteropServices;
// Simple P/Invoke call to native Sleep (Windows kernel32)
// Note: This demo may only run on Windows, but it compiles everywhere.
public class Program
{
[DllImport("kernel32.dll")]
private static extern void Sleep(uint dwMilliseconds);
public static void Main(string[] args)
{
Console.WriteLine("Sleeping for 200 ms...");
// Call native function
Sleep(200);
Console.WriteLine("Awake!");
}
}
Valores devueltos nativos
Haga coincidir la firma nativa: aquí devolvemos un valor sin signo de 64 bits.
using System;
using System.Runtime.InteropServices;
// Get system uptime (ms) from native function.
public class Program
{
[DllImport("kernel32.dll")]
private static extern ulong GetTickCount64();
public static void Main(string[] args)
{
ulong ms = GetTickCount64();
Console.WriteLine("Uptime (ms): " + ms);
}
}
Cadenas y CharSet
Use CharSet.Unicode para las API de cadenas anchas (las versiones “W”). Capture los errores en tiempo de ejecución en plataformas no compatibles.
using System;
using System.Runtime.InteropServices;
// Demo: marshaling strings to Unicode with CharSet.Unicode.
// On non-Windows environments this may fail at runtime.
public class Program
{
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type);
public static void Main(string[] args)
{
Console.WriteLine("Calling MessageBox (may require Windows GUI)...");
// 0x00000040 = MB_ICONINFORMATION
try
{
int result = MessageBox(IntPtr.Zero, "Hello from P/Invoke", "Interop", 0x00000040);
Console.WriteLine("MessageBox returned: " + result);
}
catch (Exception ex)
{
Console.WriteLine("MessageBox failed at runtime: " + ex.GetType().Name);
}
}
}
SetLastError y tipos
Manejo de errores:
- Para las API que establecen GetLastError, añada SetLastError=true en DllImport
- Después de una llamada fallida, lea Marshal.GetLastWin32Error()
- Prefiera tipos exactos: uint frente a int, y punteros como IntPtr
Buenas prácticas de interoperabilidad
- Empiece con API sencillas (sin estructuras complejas)
- Use IntPtr para los identificadores; libérelos con la función nativa adecuada
- Evite las llamadas a la interfaz gráfica en entornos sin interfaz
- Documente las limitaciones de la plataforma (solo Windows, etc.)
Propósito de DllImport
Resumen
Resumen: Declare las llamadas nativas con DllImport, haga coincidir los tipos cuidadosamente, elija CharSet para las cadenas y gestione los errores mediante SetLastError y GetLastError cuando corresponda.
Preguntas frecuentes
¿La lección «Fundamentos de interoperabilidad (P/Invoke) de un vistazo» es gratis?
Sí — el texto completo de «Fundamentos de interoperabilidad (P/Invoke) de un vistazo» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 3 lecciones en total.
¿Qué aprenderé en «Fundamentos de interoperabilidad (P/Invoke) de un vistazo»?
Llame a funciones nativas con P/Invoke: fundamentos de DllImport, marshaling de strings, SetLastError y demostraciones sencillas de Win32 (Sleep, GetTickCount64). Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C# Academy?
No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 3.
¿Cuánto tiempo toma la lección «Fundamentos de interoperabilidad (P/Invoke) de un vistazo»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C# Academy?
Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Scripting de C# (dotnet script), snippets y REPL
- Fundamentos de interoperabilidad (P/Invoke) de un vistazo
- Ergonomía de la CLI