mit C# programmieren und mit dem RPi 3 ausführen

  • Hallo zusammen!

    Ich möchte kurz vorab erwähnen, dass ich vor kurzem erst ein Studium mit der Fachrichtung Elektrotechnik begonnen habe. Wir haben bisher in Informatik I nur mit Visual Studio und der Programmiersprache Visual Basic programmiert. Mit Visual Basic komme ich soweit auch gut zurecht, aber wie mir mein Dozent mitteilte, war das nur dafür da, um ein gewisses Grundverständnis für das programmieren an sich zu vermitteln. Wir werden ab dem nächsten Semester mit C# und C++ beginnen, wobei C++ nicht so dominant vertreten sein wird wie C#. Da ich inzwischen Visual Studio gut kenne, möchte ich auch wenn möglich gerne dabei bleiben und darauf zielt auch am Ende meine Frage ab. Da ab dem nächsten Semester C# wichtig wird, habe ich bereits begonnen C# zu lernen und anzuwenden. Einfachste Anwendungen wie Textausgaben usw. klappen auch schon soweit.

    Was ich wissen möchte ist folgendes. Da ich mir ein Raspberry Pi 3 zugelegt habe um damit vermeintlich einfache Projekte zu realisieren wie z.B. einen kleinen fahrenden Roboter (wie beispielsweise den GoPiGo von Dexter Industries) oder einen Smart Mirror, möchte ich gerne über Visual Studio mithilfe von C# die nötigen Sachen programmieren und diese dann über das Raspberry Pi starten. Wäre das prinzipiell möglich oder wird das definitiv nicht funktionieren? Wenn dies nicht funktioniert würde ich gerne wissen, ob man mit MonoDevelop das ganze ohne Probleme machen könnte und zum laufen bringt. Ich hab aber schon gelesen, dass wohl C# für das Raspberry Pi nicht unbedingt die beste Wahl ist, was ich auch nachvollziehen kann, aber da wir nächstes Semester an der Hochschule vorrangig mit C# programmieren, wäre das für mich persönlich die beste Option C# anzuwenden, da ich so die Programmiersprache besser lernen könnte, da ich dann mehr Übung darin hätte.

    Ich hoffe, dass ihr mir helfen könnt.

    Beste Grüße
    Keromida

    Einmal editiert, zuletzt von Keromida (13. August 2016 um 09:05)

  • Hallo Keromida,

    herzlich Willkommen in unserem Forum!

    Du willst / musst C# lernen. Die Frage, ob C# für den RPi eine gute Wahl ist oder nicht, darfst Du eigentlich nicht stellen. Du musst diese Sprache im nächsten Semester lernen und anwenden können.

    Normale Anwendungen (die auf einem PC entwickelt werden sollen) kannst Du ganz leicht mit C# und VisualStudio auf einem PC entwickeln und auf einen Raspberry Pi übertragen. Es handelt sich dabei um ByteCode, der auf der Zielmaschine ausgeführt wird. Die Zielmaschine ist dabei egal, es muss lediglich JAVA-Umgebung vorhanden sein.

    Das Ganze funktioniert so lange, bis Du z.B. GPIOs nutzen willst. Solche Anwendungen musst Du direkt auf dem Raspberry Pi entwickeln, da nur für diese Plattform die erforderlichen Bibliotheken vorhanden sind.

    Wenn Du irgendwann z.B. in C/C++ entwickeln willst, hättest Du noch die Möglichkeit, über ToolChains und Cross-Compiler auf einem PC Anwendungen zu entwickeln, die direkt auf dem Raspberry Pi laufen. Aber das ist dann was für ein weiteres Semester später ;) .

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Das sind doch sehr erfreuliche Nachrichten :thumbs1: Herzlichen Dank für die schnelle Antwort! :^^:

    Gibt es irgendwelche Voraussetzungen die erfüllt sein müssen, damit das Raspberry Pi auch dann das geschriebene Programm startet oder kann ich das ganz einfach als .exe-Datei hinterlegen und auf dem RPi installieren?

  • Hallo Keromida,


    Gibt es irgendwelche Voraussetzungen die erfüllt sein müssen, damit das Raspberry Pi auch dann das geschriebene Programm startet oder kann ich das ganz einfach als .exe-Datei hinterlegen und auf dem RPi installieren?


    Zunächst mal muss die komplette JAVA-Umgebung auf dem Raspberry Pi laufen. Das ist eine recht großen Menge an Dateien (was auch der Grund darstellt, weshalb dies auf Ablehnung stößt). Wenn Du aber eine der folgenden Anwendungen zu nutzen gedenkst, dann verteilt sich die Datenmenge: Arduinio-IDE, Processing.

    Entweder kopierst Du den ByteCode auf den Raspberry - oder Du überträgst den Quellcode (nach Erstellung) zum Testen auf den Raspberry Pi.

    Mit .exe-Dateien kann der Raspberry Pi nicht so viel anfangen. Deswegen JAVA und ByteCode-Interpreter (Mono, MonoDevelop etc).


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (13. August 2016 um 10:34)

  • Hallo

    1. "Normale Anwendungen" was sind das ?
    2. Anwendungen die mit Visual Studio auf einem PC entwickelt werden, können nicht so einfach auf eine andere Hardwareplatform wie der Raspi übertragen werden.
    3. Bytecode aus Visual Studio hat mit dem ByteCode von Java absolut nichts zu tun.

    Roßmann

  • Bei der Kompilierung von C# Quellcode wird nicht direkt systemeigener Programmcode erzeugt, sondern in einem ersten Schritt zunächst in einer Zwischensprache (CIL/MSIL). Dieser Code wird erst auf dem Ausführungsrechner in einem Laufzeitsystem mittels Just-in-Time-Kompilierung in nativen Maschinen-Code übersetzt und ausgeführt.

    Unter Windows-Rechnern dient als Laufzeitsystem normalerweise die Microsoft .NET Umgebung. Auf Linux- und anderen System ist dies normalerweise Mono. Mono ist ein Open Source Projekt, das zum Ziel hat, eine Implementierung von Microsofts .NET Framework zu realisieren.

    Unter Raspbian mit Mono wird eine Anwendung wie folgt gestartet:

    Code
    mono meine-anwendung.exe

    Um es an dieser Stelle gleich mit zu erwähnen, GPIO-Anwendungen unter Mono brauchen in der Regel root-Rechte und müssen deshalb mit sudo gestartet werden.

    Code
    sudo mono meine-gpio-anwendung.exe

    Mono kannst du unter Raspian mit folgendem Befehl installieren:

    Code
    sudo apt-get install mono-complete monodevelop

    Damit installierst du auch gleich die Werkzeuge mit, die du evtl. noch brauchst. monodevelop ist ein etwas in die Jahre gekommenes IDE zum Entwickeln von Mono-Anwendungen. Du kannst es bei der Installation auch weglassen, falls du nicht daran interessiert bist.

    Einfache Programme können auch direkt mit dem Befehl mcs in eine unter Mono ausführbare .exe-Datei kompiliert werden.
    z.B. eine HelloWorld Anwendung mit der Quell-Datei helloworld.cs.

    Code
    mcs helloworld.cs
    mono helloworld.exe

    Wurde mono-complete installiert, dann ist auch xbuild dabei, ein Build-Tool analog zu MSBuild. Du startest xbuild aus dem Verzeichnis in dem sich die Solution Datei mit der Endung .sln befindet.

    Ein Tool, wie Ngen unter Windows, mit dem nativer Code erstellt werden kann, gibt es nicht. Da der erzeugte Code nicht kompatibel ist, ist es auch nicht möglich mit Ngen unter Windows erstellte ausführbare Programme auf dem Raspberry Pi auszuführen. Es ist möglich mit der Mono-Option --aot vorkompilierte Libraries als .so Files zu erstellen. Dies kann nützlich sein um den Aufwand der JIT-Kompilierung zu reduzieren.

    Grundsätzlich gilt (etwas vereinfacht gesagt): alles was unter dem Namespace System läuft, kann unter Visual Studio erstellt und in der Regel 1:1, ohne neu zu erstellen, unter Mono ausgeführt werden. Dabei muss beim Erstellen darauf geachtet werden, dass die Assemblies einer von Mono des Zielsystems unterstützten Version entsprechen. Dies wird bei
    jeder einfachen Konsolen-Anwendung funktionieren. Sobald aber Libraries mit im Spiel sind wird es nicht mehr so einfach sein. Dies bedeutet auch, dass die für Windows 10 Core IoT verfügbaren GPIO Libraries unter Raspbian mit Mono nicht funktionieren werden (ich habe es allerdings nie ausprobiert).

    Ein paar .NET Technologien werden nicht unterstützt, entweder weil sie zu Windows-spezifisch sind, grundsätzlich nicht mehr unterstützt werden oder weil von der Entwicklergemeinde keine geeignete Lösung gefunden werden konnte um sie zu implementieren. Dazu gehören unter anderem WPF, WSE, WF3, System.EnterpriseServices, System.Management und Code Access Security. Moonlight, die Mono-Variante von Silverlight, wird nicht mehr unterstützt.

    Selbst Windows Forms Anwendungen sind theoretisch möglich. Die Komponenten werden dabei über System.Drawing nativ in das Windowing-System des Betriebssystems (X11, Win32, OSX) übersetzt. Theoretisch deshalb, weil ich auf meinen RPi unter Raspbian Jessie Lite noch nie eine Windows Forms Anwendung (via X11 VcXsrv) zum Laufen gebracht habe. Merkwürdigerweise laufen sie wenn ich sie unter Monodevelop neu erstelle und direkt aus Monodevelop heraus starte. Ich gehe mal davon aus, dass es unter einem vollständigen Raspbian Jessie mit Benutzeroberfläche funktionieren würde.

    Unter Raspbian Jessie wird zur Zeit standardmässig Mono 3.2.8 installiert und es wird das .NET Framework bis zur Version 4.5 unterstützt. Neuere Versionen von Mono, die unter Raspbian Jessie aber noch nicht zur Verfügung stehen, verfügen über noch bessere Laufzeitunterstützung von Microsoft Bibliotheken bis hin zu C# 6.0.

    Leider ist es aber auch so, dass sich wegen unterschiedlichen Implementationen im Detail immer wieder Probleme bemerkbar machen und oft ist es nicht ganz einfach die Ursache von Problemen zu finden. Es fängt an bei verschiedenen Garbage-Collectoren, unterschiedlichem Threading, aber auch im Verhalten hinsichtlich der Behandlung von Rechten, kleinen Unterschieden bei der Implementierung von Netzwerkkomponenten, bis hin zur Schlüsselverwaltung, die unter Mono speziell behandelt wird und niemals 1:1 wie unter Windows funktionieren kann.

    Ich persönlich entwickle meine Mono-Anwendungen in der Regel soweit als möglich mit Visual Studio, kopiere die Solution dann vollständig auf das Zielsystem und erstelle sie mit xbuild neu. Dabei kommen schon mal erste mögliche Probleme mit fehlenden Bibliotheken und dergleichen zu Tage.

    Monodevelop ist auf dem Raspberry etwas träge und eher nur für den Notfall oder kleinere Projekte geeignet. Im Vergleich zu Visual Studio bestehen auch krasse Unterschiede. Mit den neuen Entwicklungs-Umgebungen von Xamarin habe ich keine Erfahrungen, sie könnten für das Deployment evtl. besser sein.

    Wird ein Projekt von Visual Studio (VS 2015 Community Edition) auf den Raspberry übertragen und mit Monodevelop geöffnet, dann gibt es einen Fehler mit der Toolsversion, der sich leicht beheben lässt. Die markierte Datei einfach im Editor öffnen (rechte Maustaste, Tools... Edit File) und in der 2. Zeile ToolsVersion="14.0" in ToolsVersion="4.0" ändern. Danach die Dateien speichern und die Solution neu öffnen. Probleme hatte ich bei übertragenem Quellcode auch immer wieder mal mit den Zeilenenden.

    Zur GPIO-Programmierung schreibe ich gerade noch an einem Beispiel, das ich im Zusammenhang mit einem andern Thread versprochen habe. Das ist für mich selber Neuland und leider bin ich dabei auf ein nerviges Problem gestossen, so dass ich für das kleine Beispiel inzwischen mehrere Stunden mit einer Fehlersuche am falschen Ort verbracht habe um letztendlich festzustellen, dass es sich um ein (unlösbares) allgemeines .NET Problem handelt das mit dem Raspberry Pi, GPIO oder Mono nichts zu tun hat.

    Windows 10 Core IoT wurde auch schon erwähnt. Dies ist besonders interessant, da es Visual Studio direkt unterstützt, das Debuggen und Deployment vereinfacht und erst noch eine GPIO Library zur Verfügung stellt. Ich selber habe damit aber keine Erfahrung, da es zum Zeitpunkt als ich mich damit beschäftigt habe noch zu viele Probleme gab. Soweit ich gelesen habe, fehlen aber in der GPIO Bibliothek wichtige Dinge, die es erst interessant machen würden. Aber auch das ist schon eine Weile her und könnte sich verbessert haben.

    C# / Mono ist bestimmt nicht die Programmiersprache, die für den Raspberry Pi am Besten geeignet ist, aber ich sehe es auch nicht zu eng und sehe durchaus auch Vorteile. Es kommt bestimmt auch darauf an, was man machen will, aber für einfachere, nicht allzu zeitkritische Aufgaben reicht es alleweil.

  • Ich danke euch vielmals für die ganze ausführliche Hilfe!

    Kurzum noch ein paar Fragen. Wie kann ich die Auflösung am Raspberry Pi 3 ändern? Mein Monitor ist FullHD fähig, aber der Bildschirm hat einen schwarzen Rand an allen Seiten und ich habe nicht ganz herausgefunden wie ich das ändern kann. Des Weiteren habe ich LibreOffice auf dem Raspberry installiert, um mir Notizen usw. zu machen, aber ich kann die Benutzeroberfläche nicht auf Deutsch umstellen. Gibt es ein Sprachkit, um die Benutzeroberfläche von Englisch auf Deutsch umzustellen?

    Ich bin auch schon dran mein erstes Projekt zu starten. Ich möchte gerne einen Smart Mirror für mich uns meine Freundin haben. Da wir in unserer Wohnung im Flur nur ein ödes Bild hängen haben, soll das Bild einem Spiegel weichen. Effektiv möchte ich da nicht viel drauf haben außer einer Uhr, das Datum, das momentane Wetter und die Wetterprognose für die nächsten Tage.

    Würde ich das unter Windows machen, würde ich dafür eine Windows Forms Anwendung erstellen, aber jetzt ist das ja etwas schwierig wenn das nachher auf dem Raspberry Pi laufen soll. Ich habe mir mal erlaubt ein "Muster" zu erstellen wie ich das nachher gerne haben möchte.

    smartmirrorbeispielpnfnsb9.png

    Es gibt ja jetzt zahlreiche Möglichkeiten aus dem Internet zum Thema Smart-Mirror bzw. MagicMirror. Da ich dabei aber eigentlich nichts lerne, da das nur Copy Paste ist, will ich das definitiv selber programmieren, auch wenn es nicht mal Ansatzweise so ausgereift ist wie die jetzigen die es schon gibt. Würde das klappen wenn ich die .exe über Mono starte und ausführe, wenn ich das als Windows Forms Anwendung unter Verwendung von C# programmiere?

  • WindowsForms geht nicht unter Mono. Und im Ernst - fuer etwas so simples wuerde ich das auch gar nicht machen, sondern einfach einen Browser im Kiosk-Mode mit einer Webseite welche die Wetterinfos darstellt nutzen.

    Wenn es doch C# sein muss, wuerde ich immer noch zu Windows IoT raten - da findet man zB auch GUI-Tutorials https://www.youtube.com/watch?v=O1xGr0rfxoc

  • Da Mono (zumindest in den neueren Versionen) versucht WinForms in X11 umzusetzen ist es nicht so, dass WinForms unter Mono überhaupt nicht geht, aber realistisch betrachtet kann man das vergessen. Ich habe mal kurz versucht das Beispiel zu programmieren und zu testen. Das Beispiel ist zwar nicht vollständig, aber zeigt das Problem:

    Unter Windows 10:

    Unter Raspbian mit Mono 4.4.2:

    Im Beispiel oben habe ich die Controls in ein Panel mit schwarzem Hintergrund gesetzt um den weissen Rahmen zu erhalten. Im folgenden Beispiel habe ich das Panel entfernt und die Controls wieder auf weissen Hintergrund mit schwarzer Schrift gestellt. Das sieht dann schon besser aus, aber was dabei unter Mono herauskommt macht immer noch wenig Freude.

    Unter Windows 10:

    Unter Raspbian mit Mono 4.4.2:

    Da ich neulich im Zusammenhang mit einer Netzwerkanwendung unter Mono 3.2.8 wieder mal auf Probleme gestossen bin, habe ich auf meinem Raspberry Pi 2 zur Zeit Mono 4.4.2 installiert. Das scheint bisher nicht schlecht zu funktionieren, wobei ich zum Lösen meines Netzwerkproblems händisch nachhelfen musste, damit die von mir benötigte Assembly gefunden werden konnte. Sowas ist natürlich auch nicht gerade ideal für Anfänger.

    Ansonsten schliesse ich mich der Meinung von _deets_ an.

  • Hallo zusammen,
    ich habe mich jetzt schon eine weile hier durch das Forum geklickt und belesen, sowie auch diverse andere Ressourcen abgeklappert aber richtig schlau bin ich noch nicht geworden.
    Da ich der Meinung bin, dass sich mein Anliegen an jenes hier anlehnt hoffe ich das ich hier richtig liege, sprich mir geht es ähnlich wie der Threadersteller.
    Gliedern wir mal das ganze Thema etwas.

    Was möchte ich ?
    Ich möchte mit dem RaspPi ein Zentrales Terminal mit Touchdisplay schaffen, über welchen ich Daten von Sensoren ausgeben kann (diese gerne für Statistik aus einer SQL Datenbank). Ebenso soll der RaspPi und ggf. später weitere diese Daten mittels Sensoren (aktuell denke ich an den DHT22 / AM2302) sammeln und in die Datenbank schieben. Weiterhin eine Squeezbox steuern können und auch erweiterbar sein hinsichtlich der Funktionalität, was mir dann später noch einfällt.

    Was kann ich bereits ?
    Ich habe einige Grundlagen in HTML & PHP und auch bereits einige Schritte in C# mit WinForms gemacht. Ebenso Erfahrungen mit Powershell.

    Was ist jetzt meine Frage ?
    Ich habe die letzten Tage versucht in Xamarian und GTK# ein wenig zu probieren aber bin dabei bald verrückt geworden. Unter anderem auch daran, dass die Informationen und Dokumentationen / Tutorials im Netz eher dürftig sind (oder diese sich gut versteckt haben). Wäre der Weg über Mono und Co. sinnvoll für eine entsprechende Anwendung oder sollte ich dies aufgrund der Anbindung zur Datenbank doch eher auf PHP aufbauen ?

  • Ich würde zumindest mal einen Blick auf Kivy werfen. Und die aktuelle c't stellt das auf qt & pyqt basierende System von FischerTechnik txt Community vor. Auch einen Blick wert.


    Gesendet von iPhone mit Tapatalk

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!