gpt4 book ai didi

c# - 在 Mono for ARM 上运行简单的 winforms 应用程序

转载 作者:太空狗 更新时间:2023-10-29 19:45:17 25 4
gpt4 key购买 nike

我目前正在尝试建立一个环境,在该环境中,我可以使用 Visual Studio 2013 创建 winform 应用程序,然后我想将其放在带有附加触摸屏的 ARM v7 BeagleBone Black 上,它们应该与 Mono 一起运行。

为此,我采用了 Ubuntu 14.10 AMD64 系统,并使用 BeagleBone Black 的工具链和 scratchbox2 创建了一个交叉编译环境。

我通过编译一些 native 测试程序验证了 sb2 工具链是否正常工作,它们确实在 Ubuntu 机器(带有 sb2)和 BeagleBone Black 上完美运行。

接下来,我从源代码编译了 mono,一次用于 Ubuntu 机器,一次用于 BeagleBone Black。为此,我主要遵循this post。 .最后,我得到了一个目录,其中包含完整的 mono 树,其 native 组件已为 ARM 正确编译。我通过在 Ubuntu 系统上运行 sb2 mono -V 以及在将 mono 目录复制到 BeagleBone Black 上运行 mono -V 来验证这一点。我还可以在 BBB 的单声道上运行我使用 VS2013 创建的简单 .NET 控制台应用程序。

接下来我尝试运行一个简单的 GUI 应用程序,它基本上只包含一个表单和一个弹出消息框的按钮。 VS 中的项目设置设置为 .NET Framework 版本 4.5 和“发布”。

接下来,我尝试在 Ubuntu 系统上使用 mono 运行此 EXE,在调整 ./configure 选项、重新编译 mono (--with-tls=__thread) 并安装所需的库(libgdiplus 和 libx11)后,它工作正常。但是,当我尝试在 BBB 上运行相同的 EXE 时,它崩溃并出现以下异常:

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

我想知道问题可能是什么?我该如何继续?

顺便说一句:这是 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

更新: 我刚刚注意到这个名为 mono-test-install 的小型单声道实用程序。当我在 BBB 上运行它时,它告诉我:

./mono-test-install 
Active Mono:
Warning: pkg-config could not find mono installed on this system
No dotnet pkgconfig found, Windows.Forms, System.Drawing and others will not work

我想这可能是我的问题。在这种情况下,有人知道如何让事情走上正轨吗?我假设我必须以某种方式告诉 mono 在哪里可以找到它的库和程序集,但我不能确定...如果有人能对此有所说明,那就太好了。

更新 2: 通过为我手工制作的单声道版本(described here)。此外,我还必须编辑文件 [mono-directory]/usr/local/bin/mcs 并更正可执行文件的路径。我假设您可以在配置单声道时使用 PREFIX=... 自动设置它们,但我没有那样做。

现在,当我运行 mono-test-install 时,我得到了这个:

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

所以我认为现在应该一切就绪并正确设置。但它仍然不起作用。当我运行我的小 winforms 测试程序时,我得到了与上面给出的完全相同的异常。

经过一些搜索,我发现可能有一个 bug in mono因为我不是第一个遇到这个的人。然而奇怪的是,同一个 EXE 在具有完全相同的单声道版本的 Ubuntu 上完美运行(只是为 amd64 而不是 armv7 编译,相同的配置选项)。所以在 PC 上一切正常,在 arm 上它崩溃了。

更新:我提交了一份报告,其中附有产生问题的示例项目 here .

最佳答案

一点挖掘表明 GDI+ GdipCreateBitmapFromScan0当宽度或高度为非正数时,返回 InvalidParameter

进行 upper the stack trace指示当首选光标大小(由来自 libX11 的 XQueryBestCursor 报告)与原始光标大小(32x32 像素)不同时,从 X11 驱动程序调用 Bitmap 构造函数。

所以想法是 BeagleBone 上的 XQueryBestCursor() 为光标返回零宽度/高度。一些谷歌搜索让我们找到了 thread描述一个类似的问题。那里甚至还有某种补丁。

我认为您应该使用提供的补丁在 BeagleBone 上重新编译 X11,或者在单声道源代码中添加一些检查(在调用 XQueryBestCursor 之后)以便当 X11 返回零宽度时它使用光标的原始宽度/高度/高度。

UPD:硬件光标大小似乎实际上是由视频驱动程序报告的,因此您可以尝试另一个,例如最近的 xf86-video-fbdev。

关于c# - 在 Mono for ARM 上运行简单的 winforms 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28674759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com