我在Linux上的Mono下运行了Delphi prism(.NET)程序。它运行了一段时间后在终端上崩溃,并显示以下错误消息。但同样的程序在Windows7 上运行得很好
有人能告诉我为什么吗?
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
看起来您的程序正在使用Windows窗体。对Windows窗体的支持在mono中不是最好的。Mono提供了运行时和库,但如果你想制作一个跨平台的程序,你也需要考虑你使用的UI库。
更新(2016):
我最初的回答可能是错的。根据这个页面,对Windows Forms 2.0的支持是完整的,但可能仍然有一些错误,我还没有尝试过。但是,如果你使用第三方UI库,例如Infrastics,它们可能由于本机调用而无法工作。
请查看此页面,了解有关移植Winforms应用程序的更多信息,包括可以提供帮助的工具MoMA。
我也遇到了同样的问题(.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
{
它来自另一个线程并完成它的工作。
另一个订阅者也在主窗体上触发了一个事件。我忽略了此事件,问题消失了。