Можно ли запустить код .NET на Pi, используя моно?

41

Возможно ли (и возможно) запускать приложения .NET на Raspberry Pi с Mono ?

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

berry120
источник
Может быть, Portable.NET также вариант.
Der Hochstapler

Ответы:

25

Существует вопрос StackOverflow, очень похожий на этот, Mono on Raspberry Pi . Однако, благодаря моим собственным исследованиям, я не смог найти ничего специфического для .NET, а только C #.

Вы можете установить среду выполнения, используя APT в дистрибутиве Debian, выполнив:

$ sudo apt-get install mono-runtime

Вы также можете (при условии, что у вас есть какой-то GUI, такой как LXDE) установить медленную Mono IDE с:

$ sudo apt-get install monodevelop

Для Arch Linux ARM вам нужно установить среду выполнения через Pacman , например так:

$ sudo pacman -S mono

Mono IDE может быть установлен аналогичным образом:

$ sudo pacman -S monodevelop
Эндрю Ларссон
источник
1
Что вы подразумеваете под "скорее просто C #"?
Джон Эгертон
@JonEgerton C # - это язык, а .NET - это фреймворк. Вы можете разрабатывать для .NET Framework с помощью C #, но C # может оставаться самостоятельным языком программирования. Более подходящим примером может быть: вы разрабатываете для Android с Java, но вы можете написать настольную программу с Java. C # не зависит от .NET, но .NET зависит от C #.
Эндрю Ларссон
Привет, извини, я не это имел ввиду (я разработчик .Net !!). Это была скорее исключительность C #, а не других языков семейства .net (vb.net, J # F # и т. Д.). Я никогда не изучал Mono и не понял, что это только C #.
Джон Эгертон
5
@Andrew И наоборот: .NET не зависит от C # - но C # зависит от среды выполнения, такой как .NET (или Mono), на практике он никогда не является независимым языком программирования. Кроме того, mono полностью не зависит от языка (как и .NET), поэтому, опять же, он не зависит от C #.
Конрад Рудольф
1
Не устанавливайте MonoDeveloper на устройство. Это вааааа, чтобы замедлить. Просто смонтируйте сетевой привод с CIFS и скомпилируйте на быстром ПК / MAC, а затем выполните тестовый запуск по локальной сети.
BerggreenDK
8

Вопреки распространенному мнению, скомпилированный код VB.NET отлично работает на Raspberry Pi, по крайней мере, под Debian. apt-get установите mono-vbnc, а затем запустите VB exe в качестве аргумента для mono, например, mono yourexe.exe

Я не делал никаких тестов производительности, так как я не пишу приложения с высокой производительностью, но пока все в порядке.

парень
источник
любой язык .NET компилируется в один и тот же IL / Bytecode, поэтому, как только вы запустите компилятор (mono-vbnc или любой другой язык), ваш VB исчезнет, ​​и IL будет использоваться в ядре RUNTIME.
BerggreenDK
6

Код .NET, использующий библиотеки .NET Framework, не может работать на Raspberry Pi, так как для его работы требуется ARM-версия NETMF или CLR . На данный момент Microsoft еще не выпустила Windows на ARM (WoA). Обратитесь к Эксперименту 19 для Microsoft Research CLR работает над ARM.

Однако запуск кода .NET (без ссылки или с использованием библиотек .NET Framework) возможен при использовании Mono, поскольку Mono имеет CLR для устройств ARM.

См. Также Создание Windows для архитектуры процессора ARM для получения информации о Windows на ARM (WoA).

JeeShen Lee
источник
3
Я думаю, что ваше утверждение здесь не так. Можно скопировать файл .EXE, скомпилированный на ПК, который ссылается и использует классы платформы .NET (например, класс Socket или класс TcpListener), скопировать его без изменений в RPi и заставить его отлично работать на RPi под Mono. Это связано с тем, что Mono заменяет большинство базовых классов .NET Framework своей собственной версией, используя точно такие же пространства имен, типы и интерфейсы.
dodgy_coder
4

У меня есть приложение командной строки .NET для работы с Mono. Приложение в основном делает что-то похожее на переадресацию портов, принимает данные, полученные через последовательный UART, и пересылает их по TCP / IP. Он использует классы SerialPort, TcpListener, TcpClient и Socket .NET, при этом только незначительные изменения необходимы для кода обработки SerialPort. Я использую ОС Debian Soft Float.

С точки зрения производительности, первое, с чем я столкнулся, были некоторые существенные замедления в некотором коде отладки / трассировки, который форматировал массив байтов в строку для целей регистрации. Это было в 50 раз медленнее, чем на ПК.

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

Для модульного тестирования NUnit отлично работает на RPi ...

Чтобы установить NUnit:

sudo apt-get install nunit

Бежать:

nunit-console appUnderTest.exe
dodgy_coder
источник
1
Скорость это относительная вещь. Но Raspberry PI, работающий на частоте 1000 МГц (модель 2), работает примерно как Pentium 300 МГц, так что это может объяснить, почему .NET / MONO чувствует себя довольно медленно для начала.
BerggreenDK