Rust внутри .NET: как упаковать native-библиотеку в один NuGet-пакет
arnkey 12 минут назад Rust внутри .NET: как упаковать native-библиотеку в один NuGet-пакет Средний 8 мин 374 .NET * C# * Rust * Из песочницы FFI, P/Invoke, EmbeddedResource, DllImportResolver и кроссплатформенная...
GPT-5.6 31 Temmuz 2026'da yayınlanacak mı?
В сфере искусственного интеллекта произошло заметное событие. arnkey 12 минут назад Rust внутри . NET: как упаковать native-библиотеку в один NuGet-пакет Средний 8 мин 374 . NET * C# * Rust * Из песочницы FFI, P/Invoke, EmbeddedResource, DllImportResolver и кроссплатформенная доставка без ручного копирования .
В примерах ниже используется условная функция шифрования, но статья не про криптографию. Основная тема - FFI, владение памятью и доставка native-бинарей в . Для production-криптографии лучше брать проверенные библиотеки и режимы, а не писать собственный алгоритм.
Технические детали
Зачем это понадобилосьКогда . NET-коду нужно вызвать Rust-библиотеку, первый прототип обычно заводится быстро:Rust собирается как cdylib;функции экспортируются через extern "C";C# вызывает их через DllImport;результат возвращается через указатель. Проблемы начинаются позже, когда библиотеку нужно отдать другим командам или использовать в нескольких сервисах.
Кто-то забывает положить файл рядом с приложением, CI собирает не тот target, путь до native-библиотеки отличается на разных окружениях, а ошибка всплывает только в runtime. Хочется другого сценария:dotnet add package Ted. EncryptionИ чтобы после этого все работало без ручного копирования native-файлов.
В этой статье покажу схему, при которой все native-бинарники упакованы в один NuGet-пакет, а . NET сам выбирает и загружает нужный файл через DllImportResolver. Что получится в итогеНа уровне пользователя пакет выглядит как обычная .
Отраслевые последствия
NET-библиотека:string encrypted = Encryptor. Encrypt("hello", "key-123 string decrypted = Encryptor. (encrypted, "key-123 А внутри происходит вот это:+------------------+ dotnet add package +-----------------------+ | Consumer .
NET app | -------------------------------> | NuGet package | +------------------+ +-----------------------+ | DllImport("ted_encryption | v v +------------------+ +-----------------------+ | Managed wrapper Embedded native files C# / . dylib | +------------------+ +-----------------------+ | P/Invoke | v v +--------------------------------------------------------------------------+ | Rust cdylib: extern "C" functions, C-compatible ABI, manual memory owner | +--------------------------------------------------------------------------+ Ключевая мысль: P/Invoke решает вызов функции, но не решает доставку native-бинарей. Доставку решает связка EmbeddedResource + DllImportResolver.
Общая архитектураРешение состоит из четырех частей:+----------------------+ +--------------------------+ | Rust crate . NET wrapper crate-type = cdylib | ---> | DllImport + safe facade | +----------------------+ +--------------------------+ v v +----------------------+ +--------------------------+ | Native binaries | ---> | EmbeddedResource win/linux/macos inside .
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.



