2015-02-23 15 views
7

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.

+0

Vielleicht ein dummer Vorschlag, aber was passiert, wenn Sie .NET Framework-Version auf 3.5 senken? – Odrai

+0

Ich habe das versucht, es hat auch nicht funktioniert. – Robert

+0

Versuchen Sie [MONO_LOG_LEVEL = debug] (http://www.mono-project.com/docs/debug+profile/debug/), damit Sie mehr (Fehler-) Informationen erhalten. – Odrai

Antwort

0

Ein wenig Graben zeigt, dass GDI + GdipCreateBitmapFromScan0 zurückkehrt, wenn InvalidParameter Breite oder Höhe ein nicht-positive Zahl ist.

upper the stack trace gehend zeigt, dass Bitmap Konstruktor von X11-Treiber aufgerufen wird, wenn bevorzugte Cursorgröße (berichtet von XQueryBestCursor von libX11) von der ursprünglichen Cursorgröße unterscheidet (die 32x32 Pixel).

Also der Gedanke ist, dass XQueryBestCursor() auf Ihrem BeagleBone Null Breite/Höhe für den Cursor zurückgibt. Ein bisschen Googeln bringt uns auf die thread beschreibt ein ähnliches Problem. Da gibt es sogar eine Art Patch.

Ich glaube, Sie sollten entweder X11 auf Ihrem BeagleBone mit einem Patch neu kompilieren, oder fügen Sie einige Prüfungen in Mono-Quelle (nach dem Aufruf XQueryBestCursor), so dass Cursor ursprüngliche Breite/Höhe verwenden, wenn X11 Null Breite/Höhe zurückgibt.

UPD: HW Cursor Größe scheint tatsächlich von Videotreiber gemeldet werden, so können Sie wahrscheinlich einfach versuchen, ein anderes, wie die letzten xf86-video-fbdev.