0Pricing
C# Academy · Lección

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

Comprobación rápida: ¿Qué hace el atributo DllImport en P/Invoke?

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

  1. Scripting de C# (dotnet script), snippets y REPL
  2. Fundamentos de interoperabilidad (P/Invoke) de un vistazo
  3. Ergonomía de la CLI
← Volver a C# Academy