【问题标题】:Why .net program on linux under mono fails to run?为什么单声道下linux上的.net程序无法运行?
【发布时间】:2013-02-04 19:03:02
【问题描述】:

我在 Mono 下的 Linux 上运行了我的 Delphi-prism (.NET) 程序。它运行了一段时间并在终端上出现以下错误消息而崩溃。但同样的程序在 Windows 7 上运行良好

谁能告诉我为什么?

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object
  at System.Windows.Forms.XEventQueue+PaintQueue.Dequeue () [0x00000] in <filename unknown>:0
  at System.Windows.Forms.XplatUIX11.GetMessage (System.Object queue_id, System.Windows.Forms.MSG& msg, IntPtr handle, Int32 wFilterMin, Int32 wFilterMax) [0x00000] in <filename unknown>:0
  at System.Windows.Forms.XplatUI.GetMessage (System.Object queue_id, System.Windows.Forms.MSG& msg, IntPtr hWnd, Int32 wFilterMin, Int32 wFilterMax) [0x00000] in <filename unknown>:0
  at System.Windows.Forms.Application.RunLoop (Boolean Modal, System.Windows.Forms.ApplicationContext context) [0x00000] in <filename unknown>:0
  at System.Windows.Forms.Application.Run (System.Windows.Forms.ApplicationContext context) [0x00000] in <filename unknown>:0
  at System.Windows.Forms.Application.Run (System.Windows.Forms.Form mainForm) [0x00000] in <filename unknown>:0
  at Millennia.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0

【问题讨论】:

  • mono-project.com/Debugging。没有人保证任何 .NET 程序都可以在 Mono 上运行。
  • @LexLi,但这就是微软向公众出售他们的 .NET 的方式——编译一次并在任何地方运行。 :) 这本身不是微软自己的保证吗?
  • 微软不是 SUN。它从不说编译一次并在任何地方运行它。请不要误解那家公司:)
  • 但是WORA的思路是一样的。就像 SUN 的口号一样,您可以使用 .NET 框架以任何 Microsoft 认证的编程语言进行编程,并使用 CLI 运行它。互操作性不是和WORA有点意思一样吗?事实上,我在某处读到 .NET 的想法来自 SUN 的一次编译,随处运行的想法。
  • 你完全搞错了。当 Microsoft 声明 .NET 是跨平台时,这意味着 .NET 应用程序可以在安装了 .NET Framework 的所有 Windows 版本上运行。微软已经实现了这一点。另一方面,Mono 的目标之一是使用 C# 和 CLR 使 Linux 开发更容易。将 .NET 应用程序移植到 Mono 的优先级不高。

标签: linux mono delphi-prism oxygene


【解决方案1】:

您的程序似乎正在使用 Windows 窗体。对 Windows 窗体的支持在单声道中并不是最好的。 Mono 提供了运行时和库,但是如果你想制作一个跨平台的程序,你还需要考虑你使用的 UI 库。

更新(2016 年):

我原来的答案可能是错误的。根据this page的说法,对Windows Forms 2.0的支持已经完成,但是可能还是有一些bug,我还没试过。但是,如果您使用第三方 UI 库,例如 Infragistics,它们可能会因本地调用而无法工作。

查看this page 了解有关移植 Winforms 应用程序的更多信息,包括可以提供帮助的工具 MoMA。

【讨论】:

  • 这个断言恕我直言不妥。有许多用 WinForms 编写的项目在 Mono 上成功运行,包括许多商业产品(例如 JArchitect)。所以只有调试才能揭露罪魁祸首。使用 GTK# 或 Qt 重写 UI 可能是一种选择,但需要付出很多努力。
  • @LexLi 好吧,一方面我同意你的看法——如果你已经有了一个大产品,重写 GUI 不是一个好主意。另一方面,至少 Qt,比 WinForms 更先进的工具包。 WinForms 甚至没有实现主要选择,首先!而且我不是在说通常的事情,比如«Ctrl+Backspace»删除小部件中的文本,用鼠标中键滚动等等。
  • @Hi-Angel 该评论是多年前发表的。目前的状态是类似的,没有环来统治他们。开发人员可以选择任何满足需求的框架,而 xwt 和 Eto.Forms 获得了一定的普及。如果您愿意,当然可以使用 Qt,但考虑到我使用 Perforce 的糟糕体验,我个人会尽量避免它。
  • @LexLi 我不确定他们在 Perforce 中做了什么(甚至没有看到那个应用程序),但作为一个同时使用 Qt (虽然不在 C# 中) 和 WinForms (在 C# 中),我只是在说事实:有一堆琐事由于某种原因在 WinForms 中不起作用,就像我刚才所说的那样提及。关于 xwt 和 Eto.Forms 不能说什么,因为这是我第一次听说它们。
  • @Hi-Angel Perforce 客户端应用是基于 Qt 的,所以它可以跨平台运行,但它看起来很丑,并且不适合不同的操作系统。
【解决方案2】:

我遇到了同样的问题(.net、Linux、Mono)。 我的程序有一个提供者-订阅者模式。提供者在另一个线程上。 主窗体订阅了提供者。触发时:

    private void RefreshLabels(ParameterMap pm)
    {
        string StateValueKey = string.Empty;
        string svkValue = string.Empty;

        if (InvokeRequired)
        {
            BeginInvoke(new RefreshItemsDelegate(RefreshLabels), new object[] { pm });
        }
        else
        {

..... 它来自另一个线程并完成它的工作。

另一个订阅者也在主窗体上触发了一个事件。我忽略了这个事件,问题消失了。

【讨论】:

    猜你喜欢
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多