110просмотров
59.1%от подписчиков
24 марта 2026 г.
Score: 121
Нативный код в .NET-библиотеке и как его готовить
#dotnet #csharp #pinvoke Практическая инструкция по вызову нативного кода из .NET: P/Invoke, маршалинг, сборка бинарников для Windows и macOS и упаковка в NuGet. Разбор паттернов (фасад нативного бэкенда), тонкостей делегатов и хэндлов, а также отличий DllImport и LibraryImport. 🧩 Унифицированный нативный бэкенд: скрываем OS-специфику за функциями с одинаковым API (например GetInputDevicesCount) и подключаем один бинари-импорт "Native". 🔌 P/Invoke и LibraryImport: DllImport использует рантаймный маршалинг, LibraryImport — source generator для AOT/trimming и более эффективного вызова; указываем CallingConvention/ExactSpelling для надёжности. 🛠️ Сборка бинарников: на macOS собираем arm64 и x86_64 через clang и объединяем lipo в fat dylib; в Windows получаем отдельные DLL для x64 и ARM64 через Visual Studio/msbuild (ARM64EC). 🧠 Маршалинг и безопасность: IntPtr — основной инструмент для «сырых» указателей; обязательно фиксировать делегаты от GC; осторожно с Auto SafeHandle — лучше контролировать передачу raw-указателей и освобождение ресурсов. 📦 NuGet и native-файлы: кладём DLL/DTLIB в runtimes/.../native или build с NuGet.targets, чтобы при установке пакета нужные бинарники автоматически копировались в output для соответствующего RID. https://habr.com/ru/articles/1013334/ @aStateOfNet