0Pricing
C# Academy · Урок

Основы взаимодействия с неуправляемым кодом (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 при использовании P/Invoke?

Повторение

Повторение: объявляйте нативные вызовы с помощью 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 — локальная установка не требуется.

Все уроки этого курса

  1. Скрипты C# (dotnet script), фрагменты и REPL
  2. Основы взаимодействия с неуправляемым кодом (P/Invoke)
  3. Удобство интерфейса CLI
← Назад к C# Academy