Ich versuche derzeit, eine Umgebung einzurichten, in der ich Winform-Anwendungen mit Visual Studio 2013 erstellen kann, die ich dann auf einem ARM v7 BeagleBone Black mit einem angeschlossenen Touchscreen platzieren möchte sollte mit Mono laufen.Ausführen einfacher Winforms-Anwendung auf Mono für ARM
Um dies zu tun, nahm ich ein Ubuntu 14.10 AMD64-System und erstellt eine Cross-Compile-Umgebung mit der BeagleBone Black Toolchain und Scratchbox2.
Ich habe verifiziert, dass die Toolchain und ein sb2 korrekt funktionieren, indem sie einige native Testprogramme damit kompilieren, sie laufen einwandfrei auf dem Ubuntu-Rechner (mit sb2) sowie auf dem BeagleBone Black.
Als nächstes kompilierte ich Mono aus der Quelle, einmal für die Ubuntu-Maschine und auch einmal für den BeagleBone Black. Um dies zu tun, folgte ich hauptsächlich this post. Am Ende hatte ich ein Verzeichnis mit dem kompletten Monobaum, dessen native Komponenten für ARM korrekt kompiliert worden waren. Ich habe dies verifiziert, indem ich sb2 mono -V
auf dem Ubuntu-System sowie mono -V
auf dem BeagleBone Black ausgeführt habe, nachdem ich das Mono-Verzeichnis darauf kopiert hatte. Ich kann auch eine einfache .NET-Konsolenanwendung ausführen, die ich mit VS2013 auf dem BBB's Mono erstellt habe.
Als nächstes habe ich versucht, eine einfache GUI-Anwendung zu starten, die im Grunde nur aus einem einzigen Formular und einer Schaltfläche besteht, die eine Nachrichtenbox öffnet. Die Projekteinstellungen in VS wurden auf .NET Framework Version 4.5 und "Release" festgelegt.
Als nächstes habe ich versucht, diese EXE mit mono auf dem Ubuntu-System zu laufen und es funktionierte nach dem Optimieren der ./configure Optionen, Monos neu kompilieren (--with-tls = __ thread) und die erforderlichen Bibliotheken installieren (libgdiplus und libx11) . Aber wenn ich versuche, das gleiche EXE auf dem BBB laufen sie mit dieser Ausnahme abstürzt:
Unhandled Exception:
System.ArgumentException: A null reference or invalid value was found [GDI+ status: InvalidParameter]
at System.Drawing.GDIPlus.CheckStatus (Status status) [0x00000] in <filename unknown>:0
at System.Drawing.Bitmap..ctor (Int32 width, Int32 height, PixelFormat format) [0x00000] in <filename unknown>:0
at System.Drawing.Bitmap..ctor (System.Drawing.Image original, Int32 width, Int32 height) [0x00000] in <filename unknown>:0
at System.Drawing.Bitmap..ctor (System.Drawing.Image original, Size newSize) [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) System.Drawing.Bitmap:.ctor (System.Drawing.Image,System.Drawing.Size)
at System.Windows.Forms.XplatUIX11.DefineCursor (System.Drawing.Bitmap bitmap, System.Drawing.Bitmap mask, Color cursor_pixel, Color mask_pixel, Int32 xHotSpot, Int32 yHotSpot) [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUI.DefineCursor (System.Drawing.Bitmap bitmap, System.Drawing.Bitmap mask, Color cursor_pixel, Color mask_pixel, Int32 xHotSpot, Int32 yHotSpot) [0x00000] in <filename unknown>:0
at System.Windows.Forms.Cursor.CreateCursor (System.IO.Stream stream) [0x00000] in <filename unknown>:0
at System.Windows.Forms.Cursor..ctor (System.Type type, System.String resource) [0x00000] in <filename unknown>:0
at System.Windows.Forms.Cursors.get_SizeNWSE() [0x00000] in <filename unknown>:0
at System.Windows.Forms.SizeGrip..ctor (System.Windows.Forms.Control CapturedControl) [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) System.Windows.Forms.SizeGrip:.ctor (System.Windows.Forms.Control)
at System.Windows.Forms.ScrollableControl.CreateScrollbars() [0x00000] in <filename unknown>:0
at System.Windows.Forms.ScrollableControl..ctor() [0x00000] in <filename unknown>:0
at System.Windows.Forms.ContainerControl..ctor() [0x00000] in <filename unknown>:0
at System.Windows.Forms.Form..ctor() [0x00000] in <filename unknown>:0
at guitest.Form1..ctor() [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) guitest.Form1:.ctor()
at guitest.Program.Main() [0x00000] in <filename unknown>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentException: A null reference or invalid value was found [GDI+ status: InvalidParameter]
at System.Drawing.GDIPlus.CheckStatus (Status status) [0x00000] in <filename unknown>:0
at System.Drawing.Bitmap..ctor (Int32 width, Int32 height, PixelFormat format) [0x00000] in <filename unknown>:0
at System.Drawing.Bitmap..ctor (System.Drawing.Image original, Int32 width, Int32 height) [0x00000] in <filename unknown>:0
at System.Drawing.Bitmap..ctor (System.Drawing.Image original, Size newSize) [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) System.Drawing.Bitmap:.ctor (System.Drawing.Image,System.Drawing.Size)
at System.Windows.Forms.XplatUIX11.DefineCursor (System.Drawing.Bitmap bitmap, System.Drawing.Bitmap mask, Color cursor_pixel, Color mask_pixel, Int32 xHotSpot, Int32 yHotSpot) [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUI.DefineCursor (System.Drawing.Bitmap bitmap, System.Drawing.Bitmap mask, Color cursor_pixel, Color mask_pixel, Int32 xHotSpot, Int32 yHotSpot) [0x00000] in <filename unknown>:0
at System.Windows.Forms.Cursor.CreateCursor (System.IO.Stream stream) [0x00000] in <filename unknown>:0
at System.Windows.Forms.Cursor..ctor (System.Type type, System.String resource) [0x00000] in <filename unknown>:0
at System.Windows.Forms.Cursors.get_SizeNWSE() [0x00000] in <filename unknown>:0
at System.Windows.Forms.SizeGrip..ctor (System.Windows.Forms.Control CapturedControl) [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) System.Windows.Forms.SizeGrip:.ctor (System.Windows.Forms.Control)
at System.Windows.Forms.ScrollableControl.CreateScrollbars() [0x00000] in <filename unknown>:0
at System.Windows.Forms.ScrollableControl..ctor() [0x00000] in <filename unknown>:0
at System.Windows.Forms.ContainerControl..ctor() [0x00000] in <filename unknown>:0
at System.Windows.Forms.Form..ctor() [0x00000] in <filename unknown>:0
at guitest.Form1..ctor() [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) guitest.Form1:.ctor()
at guitest.Program.Main() [0x00000] in <filename unknown>:0
Ich frage mich, was das Problem sein könnte? Wie kann ich von hier weitermachen?
BTW: Dies ist die Mono-Version auf dem BBB:
Mono JIT compiler version 3.12.0 (tarball Mo 23. Feb 11:40:46 CET 2015)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
TLS: __thread
SIGSEGV: normal
Notifications: epoll
Architecture: armel,vfp+fallback
Disabled: none
Misc: softdebug
LLVM: supported, not enabled.
GC: sgen
Update: ich diesen kleinen mono Dienstprogramm mono-test-install
genannt gerade bemerkt. Wenn ich es auf der BBB laufe, sagt es mir das:
Ich denke, dass das mein Problem sein kann. Weiß jemand, wie man in diesem Fall die Dinge auf Kurs bringt? Ich nehme an, dass ich irgendwie mono sagen muss, wo es seine Bibliotheken und Versammlungen finden kann, aber ich kann nicht sicher sagen ... Es wäre großartig, wenn jemand etwas Licht darauf werfen könnte.
Update 2: ich in der Lage war der Fehler, der durch mono-test-install
gezeigt, um loszuwerden, indem Sie die entsprechenden Umgebungsvariablen für meine handgemachte Mono-Version zu schaffen (described here). Außerdem musste ich die Datei [mono-directory]/usr/local/bin/mcs
bearbeiten und die Pfade zu den ausführbaren Dateien korrigieren. Ich nehme an, Sie können sie automatisch mit PREFIX=...
einstellen, wenn Sie Mono konfigurieren, aber das habe ich nicht gemacht.
Nun, wenn ich mono-test-install
laufen bekomme ich diese:
Active Mono: /home/root/monotree_armv7/usr/local/bin/mono
Other Mono executables: /usr/local/bin/mono
Your have a working System.Drawing setup
Your file system watcher is: System.IO.InotifyWatcher
Ich denke also, es jetzt richtig alles an seinem Platz und eingerichtet sein sollte. Aber es funktioniert immer noch nicht.Wenn ich mein kleines winforms Testprogramm laufe, bekomme ich die selbe Ausnahme wie oben angegeben.
Nach einigem Suchen habe ich herausgefunden, dass es wahrscheinlich eine bug in mono gibt, da ich nicht die erste bin, die darauf eingeht. Das Seltsame ist jedoch, dass die gleiche EXE auf Ubuntu mit der gleichen Mono-Version fehlerfrei läuft (nur für amd64 und nicht armv7 kompiliert, dieselben Konfigurationsoptionen). Also am PC funktioniert alles gut, auf dem Arm stürzt es ab.
Update: Ich habe einen Bericht mit einem angehängten Beispielprojekt eingereicht, das die Probleme here erzeugt.
Vielleicht ein dummer Vorschlag, aber was passiert, wenn Sie .NET Framework-Version auf 3.5 senken? – Odrai
Ich habe das versucht, es hat auch nicht funktioniert. – Robert
Versuchen Sie [MONO_LOG_LEVEL = debug] (http://www.mono-project.com/docs/debug+profile/debug/), damit Sie mehr (Fehler-) Informationen erhalten. – Odrai