Apakah mungkin menjalankan kode .NET pada Pi menggunakan mono?

41

Apakah mungkin (dan layak) untuk menjalankan aplikasi .NET pada Raspberry Pi dengan Mono ?

Jika demikian, seberapa baik mereka berjalan? Apakah GUI dasar dapat digunakan, atau apakah kinerja buruk realistis membatasi untuk aplikasi perintah baris?

berry120
sumber
Mungkin Portable.NET juga merupakan opsi.
Der Hochstapler

Jawaban:

25

Ada pertanyaan StackOverflow yang sangat mirip dengan ini, Mono on Raspberry Pi . Namun, melalui penelitian saya sendiri, saya belum dapat menemukan sesuatu yang spesifik untuk .NET, melainkan hanya C #.

Anda dapat menginstal runtime menggunakan APT pada distro Debian dengan menjalankan:

$ sudo apt-get install mono-runtime

Anda juga dapat (dengan asumsi Anda memiliki semacam GUI seperti LXDE) menginstal IDE Mono lambat dengan:

$ sudo apt-get install monodevelop

Untuk Arch Linux ARM Anda harus menginstal runtime via Pacman , seperti:

$ sudo pacman -S mono

IDE Mono dapat diinstal dengan cara yang serupa:

$ sudo pacman -S monodevelop
Andrew Larsson
sumber
1
Apa yang Anda maksud dengan "bukan hanya C #"?
Jon Egerton
@JonEgerton C # adalah bahasa sementara .NET adalah framework. Anda dapat mengembangkan kerangka NET. Dengan C #, tetapi C # dapat berdiri sendiri sebagai bahasa pemrograman independen. Contoh yang lebih relevan adalah: Anda mengembangkan untuk Android dengan Java, tetapi Anda dapat menulis program desktop dengan Java. C # tidak bergantung pada .NET, tetapi .NET tergantung pada C #.
Andrew Larsson
Hai maaf, bukan itu yang saya maksud (saya seorang .Net dev !!). Itu lebih eksklusivitas dari C # dan bukan bahasa keluarga .net lainnya (vb.net, J # F # dll). Saya tidak pernah melihat Mono, dan tidak menyadari itu hanya C #.
Jon Egerton
5
@Andrew Ini sebaliknya: .NET tidak bergantung pada C # - tetapi C # memang bergantung pada runtime seperti .NET (atau Mono), tidak pernah dalam praktiknya bahasa pemrograman independen. Selain itu, mono benar-benar bahasa agnostik (seperti halnya .NET), jadi sekali lagi tidak tergantung pada C #.
Konrad Rudolph
1
Jangan menginstal MonoDeveloper di perangkat. Itu mungkin lambat. Cukup pasang drive jaringan dengan CIFS dan kompilasi pada PC / MAC cepat dan kemudian uji-jalankan melalui LAN.
BerggreenDK
8

Berlawanan dengan kepercayaan umum, kode yang dikompilasi VB.NET berjalan dengan baik di Raspberry Pi, setidaknya di bawah Debian. apt-get install mono-vbnc dan kemudian jalankan exe VB Anda sebagai argumen untuk mono misalnya mono yourexe.exe

Saya belum melakukan tolok ukur kinerja karena saya tidak menulis aplikasi intensif kinerja tetapi sejauh ini tampaknya baik-baik saja.

Orang
sumber
setiap bahasa .NET mengkompilasi ke IL / Bytecode yang sama, jadi setelah Anda memicu kompiler (mono-vbnc atau bahasa apa pun), VB Anda hilang dan IL adalah benda yang digunakan dalam inti RUNTIME.
BerggreenDK
6

Kode .NET yang menggunakan pustaka .NET Framework tidak dapat berjalan di Raspberry Pi karena memerlukan versi NETMF atau CLR yang kompatibel dengan ARM untuk dijalankan. Sampai sekarang, Microsoft belum merilis Windows pada ARM (WoA). Lihat Eksperimen 19 untuk Microsoft Research CLR yang berfungsi pada ARM.

Namun, menjalankan kode .NET (tanpa referensi atau menggunakan .NET Framework Libraries) dimungkinkan menggunakan Mono karena Mono memiliki CLR untuk perangkat ARM.

Lihat juga Membangun Windows untuk arsitektur prosesor ARM untuk informasi tentang Windows pada ARM (WoA).

Ya ampun Lee
sumber
3
Saya pikir pernyataan Anda salah di sini. Dimungkinkan untuk menyalin file .EXE yang dikompilasi pada PC yang mereferensikan dan menggunakan kelas .NET framework (misalnya kelas Socket atau kelas TcpListener misalnya), menyalinnya dengan tidak berubah ke RPi, dan menjalankannya dengan sempurna di RPi di bawah Mono. Ini karena Mono menggantikan sebagian besar kelas dasar .NET framework dengan versinya sendiri, menggunakan ruang nama, tipe, dan antarmuka yang persis sama.
dodgy_coder
4

Saya punya perintah. Aplikasi NET untuk bekerja dengan Mono. Aplikasi ini pada dasarnya melakukan sesuatu yang mirip dengan port forwarding, mengambil data yang diterima melalui serial UART dan meneruskannya melalui TCP / IP. Menggunakan kelas SerialPort, TcpListener, TcpClient dan Socket .NET, dengan hanya perubahan kecil yang diperlukan untuk kode penanganan SerialPort. Saya menggunakan soft float OS Debian.

Dalam hal kinerja, hal pertama yang saya temui adalah beberapa perlambatan signifikan dalam beberapa kode debug / jejak yang memformat array byte menjadi string untuk keperluan logging. Itu 50x lebih lambat dibandingkan berjalan di PC.

Jadi saya akan merekomendasikan menulis beberapa tes unit kinerja saat porting kode yang ada ke RPi.

Untuk pengujian unit, NUnit berfungsi dengan baik pada ...

Untuk menginstal NUnit:

sudo apt-get install nunit

Untuk berlari:

nunit-console appUnderTest.exe
dodgy_coder
sumber
1
Kecepatan adalah hal yang relatif. Tetapi Raspberry PI yang berjalan pada 1000 mhz (model 2) melakukan kira-kira seperti Pentium 300 mhz, sehingga mungkin menjelaskan mengapa .NET / MONO terasa agak lambat untuk memulai.
BerggreenDK