Начинающий
- Статус
- Оффлайн
- Регистрация
- 24 Сен 2024
- Сообщения
- 58
- Реакции
- 16
Хочу поделиться своим опытом работы с библиотекой CsWin32, которая упрощает работу с нативными api в C#.
Что такое CsWin32?
CsWin32 - это инструмент для работы с Windows API, который использует кодогенерацию для создания PInvoke обёрток. Он делает это автоматически.
Устанавливаем через nuget:
1:
2: Создаём файл NativeMethods.txt в корне нашего проекта.
3: Добавляем в начало кода:
В файл NativeMethods.txt просто добавляете имена нужных вам функций или структур, каждую с новой строки. Например:
После сохранения файла запустится кодогенерация, и методы станут доступны в нашем коде.
Можно импортировать все методы из определённой библиотеки, используя синтаксис с wildcard в файле NativeMethods.txt. Например:
kernel32.*
user32.*
Пример кода:
И вот во что это собралось:
Что такое CsWin32?
CsWin32 - это инструмент для работы с Windows API, который использует кодогенерацию для создания PInvoke обёрток. Он делает это автоматически.
Устанавливаем через nuget:
1:
2: Создаём файл NativeMethods.txt в корне нашего проекта.
3: Добавляем в начало кода:
C#:
using static Windows.Win32.PInvoke;
В файл NativeMethods.txt просто добавляете имена нужных вам функций или структур, каждую с новой строки. Например:
После сохранения файла запустится кодогенерация, и методы станут доступны в нашем коде.
Можно импортировать все методы из определённой библиотеки, используя синтаксис с wildcard в файле NativeMethods.txt. Например:
kernel32.*
user32.*
Пример кода:
C#:
using System.Diagnostics;
using System.Runtime.CompilerServices;
using Windows.Win32.System.Threading;
using static Windows.Win32.PInvoke;
public unsafe class Program
{
private static void Main(string[] args)
{
using var handle = OpenProcess_SafeHandle(PROCESS_ACCESS_RIGHTS.PROCESS_ALL_ACCESS,
true,
(uint)Process.GetProcessesByName("devenv")[0].Id);
fixed (byte* buffer = new byte[sizeof(int)])
{
if (ReadProcessMemory(handle, (void*)0x1E825407AB4, buffer, sizeof(int), null))
{
Console.WriteLine(*(int*)buffer);
}
}
}
}
И вот во что это собралось:
Последнее редактирование: