Flutter windows dll что это такое

Обновлено: 21.11.2024

Мобильные, командные и серверные приложения Dart, работающие на платформе Dart Native, могут использовать библиотеку dart:ffi для вызова собственных C API, а также для чтения, записи, выделения и освобождения собственной памяти. FFI означает чужой функциональный интерфейс. Другие термины для аналогичных функций включают собственный интерфейс и привязки к языку

Документация по API доступна в справочнике по API dart:ffi.

Примеры

В следующих примерах показано, как использовать библиотеку dart:ffi:

Пример Описание
hello_world Как вызвать Функция C без аргументов и без возвращаемого значения.
примитивы Как вызывать функции C, у которых есть аргументы и возвращаемые значения, которые являются целыми числами или указателями. Также демонстрирует varargs.
structs Как использовать структуры для передачи строк в C и из C и для обработки простых и сложных структур C.
sqlite Пример в репозитории Dart SDK, который поставляется с мини-руководством.

Прохождение hello_world

Пример hello_world содержит минимально необходимый код для вызова библиотеки C.

Файлы

Пример hello_world содержит следующие файлы:

< td>hello_library/hello.c
Исходный файл Описание
hello.dart A Файл Dart, использующий функцию hello_world() из библиотеки C.
pubspec.yaml Обычный pubspec Dart с нижними границами SDK. это как минимум 2.6.
hello_library/hello.h Объявляет функцию hello_world().
AC-файл, который импортирует hello.h и определяет функцию hello_world().
hello_library/hello.def Файл определения модуля, в котором указывается информация, используемая при создании библиотеки DLL.
hello_library/CMakeLists.txt Файл сборки CMake для компиляция кода C в динамическую библиотеку.

При сборке библиотеки C создается несколько файлов, в том числе файл динамической библиотеки с именем libhello.dylib (macOS), libhello.dll (Windows) или libhello.so (Linux).

Создание и запуск

Вот пример создания динамической библиотеки и запуска приложения Dart:

У меня есть несколько библиотек для взаимодействия с чипом FTDI, которые я упаковал в DLL на C++. Я хотел бы создать интерфейс с Flutter и использовать эту библиотеку в настольном приложении Windows. Эти функции все еще являются новыми во Flutter, а документация очень поверхностна и специфична для мобильных устройств.

Следуя приведенному здесь руководству, я создал плагин с FFI:

А вот мой заголовочный файл с другой стороны:

Здесь у меня возникают некоторые проблемы с указателями Uint8, похоже, я получаю эту ошибку из своего кода Dart:

Будем очень признательны за любые подсказки о том, как это сделать во флаттере!

Многие из ваших типов функций объявлены в вашем коде Dart как возвращающие int , но похоже, что вместо этого они должны возвращать Uint8. Это сработает, если вы это исправите?

Тип Uint8 не существует в dart, мне нужно привязать свои функции к типам данных dart, иначе я получаю сообщение об ошибке. Также DynamicLibrary.open(""); был заполнен, я ищу больше руководства о том, как это сделать в целом, поскольку здесь работает много разных частей флаттера, которые находятся в бета-версии и на данный момент плохо документированы.

Возможно, я смогу написать для вас официальное руководство, когда позже получу доступ к своей машине с Windows. Однако на данный момент вместо чтения данных uint8 * в качестве указателя вы можете прочитать их как uint64? так как это должен быть размер вашего указателя в зависимости от архитектуры, на которой вы работаете (при условии, что 64-битная), затем приведите Uint64 к указателю?

@Nina Это, безусловно, было бы очень признательно и очень полезно для всех, кто работает с приложениями для рабочего стола Windows с помощью флаттера, поскольку использование dll является важной частью любых приложений для рабочего стола Windows. На данный момент даже с правильными типами данных я не уверен, смогу ли я замкнуть цикл и заставить его работать с имеющейся у меня информацией (:

1 Ответ 1

У меня есть решение, и оно работает с базовым кодом, представленным в проекте Flutter-Desktop-Embedding, который, я полагаю, вы использовали для своего настольного приложения. Вы на правильном пути, но вам просто нужно немного доработать.

Для тестирования я использовал этот простой код на C с несколькими функциями для проверки передачи указателей, возврата указателей, заполнения памяти, выделения и освобождения памяти. Это код C, который я использовал в своей dll.

createarray выделяет указатель uint8_t заданного размера и возвращает его вызывающей стороне.

populatearray принимает аргумент указателя uint8_t вместе с размером и заполняет его индексом

destroyarray просто освобождает выделенную память.

Теперь стандартный флаттер-код.

Теперь для нашей части кода мы должны создать указатель функции для каждой функции, которую мы хотим вызвать в dll, нам нужно правильное имя функции и правильное/правильное количество аргументов.

Нам понадобятся пакеты dart:io и dart:ffi. dart:io уже есть в коде, просто нужно импортировать dart:ffi import 'dart:ffi'; // Для FFI

Теперь, чтобы создать дескриптор библиотеки, которую необходимо загрузить, необходимо вызвать DynamicLibrary.open с именем dll. (DLL необходимо поместить в путь выполнения приложения dart или указать абсолютный путь. Путь выполнения — build/windows/runner/Debug)

final DynamicLibrary nativePointerTestLib = DynamicLibrary.open("dynamicloadtest.dll");

Мой дескриптор называется nativePointerTestLib, а имя dll — "dynamicloadtest.dll" (да, вероятно, мне следует использовать более строгие соглашения об именах)

Далее необходимо создать каждый указатель на функцию. В dll есть три функции, которые я хочу вызвать: createarray, populatearray, destroyarray.

Первый принимает аргумент размера int -> возвращает указатель на массив (Pointer) Второй принимает указатель вместе с size -> void return Третий принимает только указатель -> void возвращает

Я назвал указатели на функции nativeCreateArray , nativePopulateArray , nativeDestroyArray

Наконец, нужно просто вызвать каждую функцию и проверить, работают ли они. Я просто выбрал случайную функцию в стандартном коде, void _setCounter(int value), которая устанавливает значение счетчика и позже отображается. Я просто добавлю в этот метод дополнительный код для выполнения вызовов наших функций, а также распечатаю результаты, чтобы увидеть, работает ли он. старый метод

новый метод с нашими вызовами функций

Я вызвал nativeCreate с размером 5. dll выделит 5 байтов для массива.

Затем я вызываю функцию заполнения, которая вставит индекс от 0 до 4 в каждый элемент массива.

Затем я перебираю массив, выбирая каждый элемент в этом индексе массива, а затем получаю значение. Я присваиваю это значение строке и, наконец, печатаю и уничтожаю массив.

Окончательный код: все вместе:

После запуска примера приложения нажмите кнопку увеличения, которая затем напечатает 0 1 2 3 4, а также адрес указателя на консоль.

Прошу прощения, если это показалось ленивым, но я не флаттер-разработчик, на самом деле у меня нет опыта в этом, и сегодня был мой первый день, когда я прикасался к нему. Но разобраться в базовом коде и синтаксисе было не так уж сложно.

Поддержка настольных компьютеров позволяет компилировать исходный код Flutter в собственное настольное приложение для Windows, macOS или Linux. Поддержка рабочего стола Flutter также распространяется на подключаемые модули: вы можете установить существующие подключаемые модули, поддерживающие платформы Windows, macOS или Linux, или создать свои собственные.

Примечание. Windows полностью поддерживается в качестве цели разработки. Дополнительные сведения см. в разделе Анонс Flutter для Windows.

Поддержка настольных приложений для macOS и Linux по-прежнему находится на стадии бета-тестирования. Моментальные снимки их поддержки доступны на стабильном канале, но мы рекомендуем вам использовать бета-канал для доступа к последним функциям и исправлениям ошибок на этих платформах.

Требования

Чтобы скомпилировать настольное приложение, необходимо создать его на целевой платформе: создать приложение Windows в Windows, приложение macOS в macOS и приложение Linux в Linux.

  • SDK Flutter. См. инструкции по установке Flutter SDK.
  • Необязательно: IDE, поддерживающая Flutter. Вы можете установить Android Studio, IntelliJ IDEA или Visual Studio Code и установить плагины Flutter и Dart, чтобы включить языковую поддержку и инструменты для рефакторинга, запуска, отладки и перезагрузки настольного приложения в редакторе. Дополнительные сведения см. в разделе Настройка редактора.

Дополнительные требования Windows

Для разработки рабочего стола Windows помимо Flutter SDK вам потребуется следующее:

  • Visual Studio 2022. При установке Visual Studio выберите рабочую нагрузку «Разработка настольных компьютеров с помощью C++», включая все ее компоненты по умолчанию, чтобы установить необходимый набор инструментов C++ и заголовочные файлы Windows SDK.

Примечание. Visual Studio отличается от Code Visual Studio.

Дополнительные требования к macOS

Для разработки настольных компьютеров в macOS помимо Flutter SDK вам потребуются следующие компоненты:

Дополнительные требования к Linux

Для разработки рабочего стола Linux помимо Flutter SDK вам потребуются следующие компоненты:

Один из простых способов установить Flutter SDK вместе с необходимыми зависимостями — использовать snapd. Дополнительные сведения см. в разделе Установка snapd.

После того как у вас есть snapd , вы можете установить Flutter с помощью Snap Store или из командной строки:

В качестве альтернативы, если вы предпочитаете не использовать snapd, вы можете использовать следующую команду:

Создать новый проект

Вы можете использовать следующие шаги, чтобы создать новый проект с поддержкой рабочего стола.

Настроить

В Windows поддержка рабочего стола включена во Flutter 2.10 или более поздней версии.

В macOS и Linux поддержка настольных компьютеров по умолчанию отключена в стабильном канале. Вы можете включить его вручную с помощью одной из следующих команд, в зависимости от используемой платформы:

Примечание. Вам нужно только выполнить команду flutter config --enable-

-рабочий стол один раз. Вы можете в любой момент проверить статус вашей конфигурации, используя команду flutter config без аргументов.

Чтобы проверить, настроена ли поддержка настольных компьютеров, используйте команду flutter devices, чтобы вывести список доступных целей. В дополнение к любым мобильным или веб-устройствам вы должны увидеть строку для операционной системы, в которой вы работаете, например (в Windows):

Вы также можете запустить программу Flutter Doctor, чтобы проверить наличие нерешенных проблем. Вы должны увидеть галочку для каждой успешно настроенной области. В Windows это должно выглядеть примерно так, с записью «Разработка для Windows»:

В macOS найдите такую ​​строку:

В Linux найдите такую ​​строку:

Если Flutter Doctor обнаружит проблемы или отсутствующие компоненты для платформы, для которой вы не хотите разрабатывать, вы можете игнорировать эти предупреждения. Либо можно вообще отключить платформу с помощью команды flutter config, например:

После включения поддержки рабочего стола перезапустите IDE, чтобы она могла обнаружить новое устройство.

Создать и запустить

Создание нового проекта с поддержкой рабочего стола ничем не отличается от создания нового проекта Flutter для других платформ.

После того как вы настроили свою среду для поддержки рабочего стола, вы можете создать и запустить настольное приложение либо в среде IDE, либо из командной строки.

Использование IDE

После того как вы настроили среду для поддержки рабочего стола, обязательно перезапустите интегрированную среду разработки, если она уже была запущена.

Создайте новое приложение в своей среде IDE, и она автоматически создаст версии вашего приложения для iOS, Android, веб-сайта и настольного компьютера. В раскрывающемся списке устройств выберите Windows (настольный компьютер), macOS (настольный компьютер) или Linux (настольный компьютер) и запустите приложение, чтобы увидеть, как оно запускается на рабочем столе.

Из командной строки

Чтобы создать новое приложение, включающее поддержку рабочего стола (в дополнение к поддержке мобильных устройств и Интернета), выполните следующие команды, заменив myapp именем вашего проекта:

Чтобы запустить приложение из командной строки, введите одну из следующих команд в верхней части пакета:

Примечание: если вы не укажете флаг -d, запуск флаттера выведет список доступных целей на выбор.

Создать выпуск приложения

Чтобы создать сборку выпуска, выполните одну из следующих команд:

Распространение

Окна

Существуют различные подходы к распространению приложения Windows. Вот несколько вариантов:

  • Используйте инструменты для создания установщика MSIX (описанного в следующем разделе) для вашего приложения и распространяйте его через магазин приложений Microsoft Windows. Вам не нужно вручную создавать сертификат подписи для этого варианта, так как он обрабатывается за вас.
  • Создайте установщик MSIX и распространите его через собственный веб-сайт. Для этого варианта вам необходимо дать приложению цифровую подпись в виде сертификата .pfx.
  • Соберите все необходимые элементы и создайте собственный ZIP-файл.

Изменение имени сгенерированного двоичного файла

Чтобы изменить имя созданного приложения Windows, отредактируйте переменную BINARY_NAME, установленную в строке 4 файла windows/CMakeLists.txt в вашем проекте Flutter.

Упаковка MSIX

MSIX, новый формат пакета приложений для Windows, предоставляет современный формат упаковки и установщик. Этот формат можно использовать либо для доставки приложений в Microsoft Store в Windows, либо для прямого распространения установщиков приложений.

Самый простой способ создать дистрибутив MSIX для проекта Flutter — использовать пакет msix pub. Пример использования пакета msix из настольного приложения Flutter см. в примере поиска фотографий на рабочем столе.

Создайте самоподписанный PFX-сертификат для локального тестирования

Для частного развертывания и тестирования с помощью установщика MSIX необходимо предоставить приложению цифровую подпись в виде сертификата .pfx.

Для развертывания через Магазин Windows создание сертификата .pfx не требуется. Магазин Windows занимается созданием и управлением сертификатами для приложений, распространяемых через его магазин.

Для распространения вашего приложения путем его самостоятельного размещения на веб-сайте требуется сертификат, подписанный центром сертификации, известным Windows.

Используйте следующие инструкции для создания самозаверяющего сертификата .pfx.

Создание собственного ZIP-файла для Windows

Исполняемый файл Flutter, .exe , можно найти в вашем проекте в папке build\windows\runner\ \ . В дополнение к этому исполняемому файлу вам потребуется следующее:

  • Из того же каталога:
    • все файлы .dll
    • каталог данных
    • msvcp140.dll
    • vcruntime140.dll
    • vcruntime140_1.dll

    Поместите файлы DLL в каталог рядом с исполняемым файлом и другими библиотеками DLL и соберите их вместе в ZIP-файл. Результирующая структура выглядит примерно так:

    На этом этапе при желании было бы относительно просто добавить эту папку в установщик Windows, такой как Inno Setup, WiX и т. д.

    macOS

    Чтобы распространять приложение macOS, вы можете либо распространять его через магазин приложений macOS, либо распространять само приложение .app, возможно, со своего собственного веб-сайта. Начиная с macOS 10.14.5, вам необходимо нотариально заверить приложение macOS, прежде чем распространять его за пределами магазина приложений macOS.

    Первый шаг в обоих вышеперечисленных процессах включает работу с вашим приложением внутри Xcode. Чтобы иметь возможность скомпилировать ваше приложение изнутри Xcode, вам сначала нужно собрать приложение для выпуска с помощью команды flutter build, а затем открыть приложение Flutter macOS Runner.

    Оказавшись внутри Xcode, следуйте либо документации Apple по нотариальному заверению приложений macOS, либо распространению приложения через App Store. Вам также следует прочитать приведенный ниже раздел поддержки для macOS, чтобы понять, как права, тестовая среда приложения и усиленная среда выполнения влияют на ваше распространяемое приложение.

    Создание и выпуск приложения для macOS содержит более подробное пошаговое руководство.

    Линукс

    Исполняемый двоичный файл можно найти в вашем проекте в папке build/linux/ /bundle/ . Рядом с вашим исполняемым двоичным файлом в каталоге пакета есть два каталога:

    • lib содержит необходимые файлы библиотеки .so
    • данные содержат активы данных приложения, такие как шрифты или изображения.

    В дополнение к этим файлам ваше приложение также зависит от различных библиотек операционной системы, для которых оно было скомпилировано. Вы можете увидеть полный список, запустив ldd для своего приложения. Например, если у вас есть настольное приложение Flutter с именем linux_desktop_test, вы можете проверить системные библиотеки, от которых оно зависит, следующим образом:

    Чтобы упаковать это приложение для распространения, вам нужно включить все в каталог пакета и убедиться, что в системе Linux, на которой вы его устанавливаете, есть все необходимые системные библиотеки. Это может быть так же просто, как:

    Информацию о публикации приложения Linux в Snap Store см. в разделе Сборка и выпуск приложения Linux в Snap Store.

    По мере того, как инструмент будет укрепляться, следите за новостями о других способах распространения настольного приложения Linux.

    Добавить поддержку рабочего стола в существующее приложение Flutter

    Чтобы добавить поддержку рабочего стола в существующий проект Flutter, выполните следующую команду в терминале из корневого каталога проекта:

    Это добавит необходимые файлы и каталоги рабочего стола в ваш существующий проект Flutter. Чтобы добавить только определенные настольные платформы, измените список платформ, чтобы он включал только те платформы, которые вы хотите добавить.

    поддержка для macOS

    Следующая информация относится только к разработке для macOS.

    Разрешения и песочница приложения

    Сборки macOS по умолчанию настроены на подписание и помещаются в изолированную программную среду с помощью тестовой среды приложения. Это означает, что если вы хотите предоставить вашему приложению macOS определенные возможности или службы, например следующие:

    • Доступ к Интернету
    • Захват фильмов и изображений со встроенной камеры
    • Доступ к файлам

    Затем вы должны настроить определенные права в Xcode. В следующем разделе рассказывается, как это сделать.

    Настройка прав

    Управление настройками песочницы осуществляется в файлах macos/Runner/*.entitlements. При редактировании этих файлов не следует удалять исходные исключения Runner-DebugProfile.entitlements (которые поддерживают входящие сетевые подключения и JIT), так как они необходимы для правильной работы режимов отладки и профиля.

    Если вы привыкли управлять файлами прав через пользовательский интерфейс возможностей Xcode, имейте в виду, что редактор возможностей обновляет только один из двух файлов или, в некоторых случаях, создает совершенно новый файл прав и переключает проект для использования это для всех конфигураций. Любой сценарий вызывает проблемы. Мы рекомендуем редактировать файлы напрямую. Если у вас нет особой причины, вы всегда должны вносить одинаковые изменения в оба файла.

    Дополнительную информацию по этим темам см. в разделе «Песочница приложений и права» на сайте Apple для разработчиков.

    Усиленная среда выполнения

    Если вы решите распространять свое приложение за пределами App Store, вам необходимо нотариально заверить свое приложение для совместимости с macOS 10.15+. Для этого необходимо включить опцию Hardened Runtime. После того, как вы включили его, вам потребуется действующий сертификат подписи для сборки.

    По умолчанию файл прав позволяет использовать JIT для отладочных сборок, но, как и в тестовой среде приложения, вам может потребоваться управлять другими правами. Если у вас включены и тестовая среда приложения, и защищенная среда выполнения, вам может потребоваться добавить несколько прав для одного и того же ресурса. Например, для доступа к микрофону потребуются как com.apple.security.device.audio-input (для усиленной среды выполнения), так и com.apple.security.device.microphone (для тестовой среды приложения).

    Дополнительную информацию по этой теме см. в разделе Усиленная среда выполнения на сайте Apple для разработчиков.

    Поддержка плагинов

    Flutter для ПК поддерживает использование и создание плагинов.

    Использование плагина

    Чтобы использовать подключаемый модуль, поддерживающий рабочий стол, выполните действия для подключаемых модулей при использовании пакетов. Flutter автоматически добавляет в ваш проект необходимый нативный код, как в случае с iOS или Android.

    Мы рекомендуем следующие подключаемые модули, обновленные для работы с настольными приложениями:

    Используйте следующие ссылки, чтобы найти на pub.dev все пакеты, поддерживающие классические приложения. По этим ссылкам перечислены все пакеты, а не только пакеты плагинов. (Помните, что пакеты плагинов или плагины предоставляют интерфейс для сервисов, зависящих от платформы.)

    Написание плагина

    Когда вы начнете создавать свои собственные плагины, вам следует помнить о федерации. Федерация — это возможность определить несколько разных пакетов, каждый из которых предназначен для разных платформ, объединенных в один плагин для простоты использования разработчиками. Например, реализация url_launcher для Windows на самом деле является url_launcher_windows, но разработчик Flutter может просто добавить пакет url_launcher в свой pubspec.yaml в качестве зависимости, и процесс сборки выберет правильную реализацию в зависимости от целевой платформы. Федерация удобна тем, что разные команды с разным опытом могут создавать реализации плагинов для разных платформ. Вы можете добавить новую реализацию платформы в любой одобренный федеративный подключаемый модуль на pub.dev, если вы координируете эту работу с первоначальным автором подключаемого модуля.

    Для получения дополнительной информации, в том числе информации об одобренных подключаемых модулях, см. следующие ресурсы:

    • Разработка пакетов и подключаемых модулей, особенно раздела объединенных подключаемых модулей.
    • Как написать веб-плагин Flutter, часть 2, описывает структуру федеративных плагинов и содержит информацию, применимую к настольным плагинам.
    • Современная разработка плагинов Flutter охватывает последние улучшения поддержки плагинов Flutter.

    Образцы и кодовые лаборатории

    Написание настольного приложения Flutter Лаборатория кода, которая поможет вам создать настольное приложение, интегрирующее GitHub GraphQL API с вашим приложением Flutter.

    Вы можете запускать следующие примеры в качестве настольных приложений, а также загружать и проверять исходный код, чтобы узнать больше о поддержке Flutter для настольных компьютеров.

    Если не указано иное, эта работа распространяется под лицензией Creative Commons Attribution 4.0 International License, а образцы кода распространяются под лицензией BSD.

    Я провел небольшой эксперимент и с помощью статической среды выполнения увеличил размер каждого из текущих подключаемых модулей FDE с ~50–70 КБ до ~300–500 КБ, а Testbed.exe — с ~100 КБ до ~500 КБ.< /p>

    Несмотря на то, что это не так уж и много по сравнению с текущими размерами настольных компьютеров, мне не ясно, есть ли преимущество в этом по сравнению с простым путем для объединения необходимых библиотек времени выполнения (например, добавление в bundle_assets_and_deps) правильный подход. Нам следует более внимательно изучить компромиссы с точки зрения потенциального взаимодействия между плагинами, которые будут более изолированы при статической среде выполнения.

    Текст был успешно обновлен, но возникли следующие ошибки:

    Этот комментарий был скрыт.

    Этот комментарий был скрыт.

    Этот комментарий был скрыт.

    Прокомментировал JanezStupar 14 августа 2020 г.

    @926 так что ты сделал?

    прокомментировал flutter-painter 16 августа 2020 г.

    Чтобы быстро решить проблему, загрузите файл vcruntime140_1.dll из Интернета и поместите его в папку build/runner.
    В противном случае вы можете использовать VS для сборки cpp, но это утомительно.

    прокомментировал stuartmorgan 7 января 2021 г.

    Комментарий

    domesticmouse прокомментирован 8 января 2021 г.

    @stuartmorgan мои заметки о публикации MSIX в MS Store находятся здесь. Я не решаюсь сказать что-то еще, поскольку это приведет к дублированию документации MS и станет головной болью при обслуживании, поскольку MS неизбежно обновит свои системы.

    stuartmorgan прокомментировал 11 января 2021 г.

    Похоже, следующим шагом будет небольшое расширение (например, мы должны отделить упаковку от распространения в магазине) в виде раздела для flutter.dev/desktop, заменив (по крайней мере, в основном) текущее обсуждение упаковки для Windows.

    syleishere прокомментировал 21 января 2021 г. •

    Я думаю, что вы упустили момент об установщике exe.
    в то время как(1) День 1: загрузите исполняемый файл на свой веб-сайт, попросите друга загрузить его и протестировать на рабочем столе
    Следующий день: повторить
    Другие дни: повторить
    Следующие дни: повторить снова и снова
    >
    Окончательное приложение: пакет с MSIX

    Итак, позвольте мне понять это правильно, вместо того, чтобы просто щелкнуть ссылку с одним .exe и запустить его на рабочем столе, он должен вручную зайти в программы, найти программу, удалить ее, повторно загрузить ссылку, перейти к кофе и напиток уже утомительны, хорошо, теперь, может быть, нажмите на ссылку, пройдите весь процесс установки еще раз, найдите программу, запустите ее, пойдите на кофе, может быть, на пиво, а теперь, может быть, отчитайтесь?

    Нет, это должен быть один .exe, а MSIX может появиться на самом последнем шаге.

    Посмотрите на pyinstaller для kivy/python, чтобы он не делал из флаттера посмешище.

    Читайте также: