0Pricing
C# Academy · Lezione

Fondamenti dell’interoperabilità (P/Invoke) in breve

Chiamate funzioni native con P/Invoke: fondamenti di DllImport, marshaling delle stringhe, SetLastError e semplici demo Win32 (Sleep, GetTickCount64).

Fondamenti dell’interoperabilità (P/Invoke) in breve è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 2 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 3 lezioni in totale.

Concetto e obiettivi

P/Invoke consente a C# di chiamare funzioni contenute in DLL native.

  • Utilizzi DllImport per associare un metodo
  • Scelga CharSet e SetLastError quando necessario
  • Mantenga le firme semplici e precise

P/Invoke: Sleep

Associare la funzione nativa dichiarando un metodo gestito 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!");
  }
}

Valori restituiti nativi

Faccia corrispondere la firma nativa: in questo caso viene restituito un valore unsigned a 64 bit.

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);
  }
}

Stringhe e CharSet

Utilizzi CharSet.Unicode per le API che usano stringhe wide (le versioni “W”). Gestisca gli errori di runtime sulle piattaforme non supportate.

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 e tipi

Gestione degli errori:

  • Per le API che impostano GetLastError, aggiunga SetLastError=true in DllImport
  • Dopo una chiamata non riuscita, legga Marshal.GetLastWin32Error()
  • Preferisca i tipi esatti: uint rispetto a int, puntatori come IntPtr

Buone pratiche per l'interoperabilità

  • Inizi con API semplici (senza struct complesse)
  • Utilizzi IntPtr per gli handle; li rilasci con la funzione nativa corretta
  • Eviti le chiamate alla GUI negli ambienti headless
  • Documenti i limiti della piattaforma (solo Windows e così via)

Scopo di DllImport

Controllo rapido: che cosa fa l'attributo DllImport in P/Invoke?

Riepilogo

Riepilogo: dichiari le chiamate native con DllImport, faccia corrispondere attentamente i tipi, scelga CharSet per le stringhe e gestisca gli errori tramite SetLastError e GetLastError quando applicabile.

Domande Frequenti

La lezione «Fondamenti dell’interoperabilità (P/Invoke) in breve» è gratuita?

Sì — il testo completo di «Fondamenti dell’interoperabilità (P/Invoke) in breve» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 3 lezioni in totale.

Cosa imparerò in «Fondamenti dell’interoperabilità (P/Invoke) in breve»?

Chiamate funzioni native con P/Invoke: fondamenti di DllImport, marshaling delle stringhe, SetLastError e semplici demo Win32 (Sleep, GetTickCount64). Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 3.

Quanto tempo richiede la lezione «Fondamenti dell’interoperabilità (P/Invoke) in breve»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Scripting C# (dotnet script), snippet e REPL
  2. Fondamenti dell’interoperabilità (P/Invoke) in breve
  3. Ergonomia della CLI
← Torna a C# Academy