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
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
- Scripting C# (dotnet script), snippet e REPL
- Fondamenti dell’interoperabilità (P/Invoke) in breve
- Ergonomia della CLI