Основы взаимодействия с неуправляемым кодом (P/Invoke)
Вызывайте нативные функции через P/Invoke: основы DllImport, маршалинг строк, SetLastError и простые демонстрации Win32 (Sleep, GetTickCount64).
«Основы взаимодействия с неуправляемым кодом (P/Invoke)» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.
Концепция и цели
Вызов P/Invoke позволяет коду C# вызывать функции из нативных DLL.
- Используйте DllImport для привязки метода
- При необходимости выбирайте CharSet и SetLastError
- Делайте сигнатуры простыми и точными
P/Invoke: Sleep
Свяжите нативную функцию, объявив управляемый метод с помощью 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!");
}
}
Возвращаемые нативные значения
Сопоставьте сигнатуру нативной функции: здесь возвращается беззнаковое 64-разрядное значение.
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);
}
}
Строки и CharSet
Используйте CharSet.Unicode для API со строками в широком формате (версии с суффиксом “W”). Обрабатывайте ошибки выполнения на неподдерживаемых платформах.
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 и типы
Обработка ошибок:
- Для API, которые устанавливают GetLastError, добавьте SetLastError=true в DllImport
- После неудачного вызова прочитайте Marshal.GetLastWin32Error()
- Предпочитайте точные типы: uint вместо int, указатели — в виде IntPtr
Правила взаимодействия с платформой
- Начинайте с простых API (без сложных структур)
- Используйте IntPtr для дескрипторов; освобождайте их правильной нативной функцией
- Избегайте вызовов GUI в средах без графического интерфейса
- Документируйте ограничения платформы (только Windows и т. п.)
Назначение DllImport
Повторение
Повторение: объявляйте нативные вызовы с помощью DllImport, внимательно сопоставляйте типы, выбирайте CharSet для строк и обрабатывайте ошибки через SetLastError и GetLastError, когда это применимо.
Часто задаваемые вопросы
Урок «Основы взаимодействия с неуправляемым кодом (P/Invoke)» бесплатный?
Да — полный текст урока «Основы взаимодействия с неуправляемым кодом (P/Invoke)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.
Чему я научусь в уроке «Основы взаимодействия с неуправляемым кодом (P/Invoke)»?
Вызывайте нативные функции через P/Invoke: основы DllImport, маршалинг строк, SetLastError и простые демонстрации Win32 (Sleep, GetTickCount64). Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.
Сколько времени занимает урок «Основы взаимодействия с неуправляемым кодом (P/Invoke)»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Скрипты C# (dotnet script), фрагменты и REPL
- Основы взаимодействия с неуправляемым кодом (P/Invoke)
- Удобство интерфейса CLI