Почему программа .net в linux под моно не запускается?

Я запустил свою программу Delphi-prism (.NET) в Linux под Mono. Он работал какое-то время и зависал со следующим сообщением об ошибке на терминале. Но эта же программа прекрасно работает на 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

person ThN    schedule 04.02.2013    source источник
comment
mono-project.com/Отладка. Никто не гарантирует, что любая программа .NET может работать в Mono.   -  person Lex Li    schedule 06.02.2013
comment
@LexLi, но именно так Microsoft продала свой .NET публике - скомпилируйте один раз и запускайте его где угодно. :) Разве это не гарантия самих Microsoft?   -  person ThN    schedule 07.02.2013
comment
Майкрософт - это не САН. Он никогда не говорит, скомпилируйте один раз и запустите его где угодно. Пожалуйста, не поймите неправильно эту компанию :)   -  person Lex Li    schedule 08.02.2013
comment
Но идея та же по линии WORA. В соответствии с лозунгом SUN вы можете использовать .NET framework для программирования на любом сертифицированном Microsoft языке программирования и запускать его с помощью CLI. Разве интероперабельность не означает то же самое, что и WORA? На самом деле, я где-то читал, что идея .NET возникла из идеи SUN "скомпилировать один раз и запустить где угодно".   -  person ThN    schedule 12.11.2013
comment
Вы совершенно неправильно понимаете. Когда Microsoft заявила, что .NET является кроссплатформенной, это означало, что приложение .NET работает во всех версиях Windows с установленной .NET Framework. И это было выполнено Microsoft. С другой стороны, одна из целей Mono — упростить разработку Linux с помощью C# и CLR. Перенос приложений .NET на Mono не имеет большого приоритета.   -  person Lex Li    schedule 13.11.2013


Ответы (2)


Похоже, ваша программа использует Windows Forms. Поддержка Windows Forms не самая лучшая в моно. Mono предоставляет среду выполнения и библиотеки, но если вы хотите создать кроссплатформенную программу, вам также необходимо учитывать библиотеки пользовательского интерфейса, которые вы используете.

Обновление (2016 г.):

Мой первоначальный ответ, вероятно, неверен. Согласно этой странице, поддержка Windows Forms 2.0 завершена, но может еще будет ряд ошибок, я не пробовал. Однако если вы используете стороннюю библиотеку пользовательского интерфейса, например Infragistics, они, вероятно, не будут работать из-за нативных вызовов.

Посетите эту страницу для получения дополнительной информации о перенос приложений Winforms, включая инструмент MoMA, который может помочь.

person kristianp    schedule 07.02.2013
comment
Это утверждение ИМХО некорректно. Многие проекты, написанные на WinForms, успешно работают на Mono, включая множество коммерческих продуктов (например, JArchitect). Так что только отладка может выявить виновника. Переписать пользовательский интерфейс с использованием GTK# или Qt можно, но это требует больших усилий. - person Lex Li; 07.02.2013
comment
@LexLi хорошо, с одной стороны, я бы с вами согласился — переписывать графический интерфейс — не очень хорошая идея, если у вас уже есть большой продукт. С другой стороны, как минимум, Qt, гораздо более продвинутый инструментарий, чем WinForms. Для начала в WinForms даже не реализован первичный выбор! И я не говорю о привычных вещах вроде «Ctrl+Backspace» для удаления текста в виджетах, прокрутки средней кнопкой мыши и т.п. - person Hi-Angel; 30.06.2016
comment
@ Привет-Ангел, этот комментарий был сделан много лет назад. Нынешний статус похож на то, что нет кольца, чтобы править ими всеми. Разработчики могут выбирать любые фреймворки, отвечающие потребностям, а xwt и Eto.Forms набирают популярность. Qt, конечно, можно использовать, если хотите, но учитывая мой неудачный опыт работы с Perforce, лично я стараюсь его избегать. - person Lex Li; 30.06.2016
comment
@LexLi Я не уверен, что они делали в Perforce (даже не видел это приложение), но как человек, который работал с Qt (хотя и не на C#) и WinForms (на C#), я просто говорю факты: есть куча мелочей, которые по какой-то причине не работают в WinForms, как то, что я только что упомянул. Не могу ничего сказать о xwt и Eto.Forms, так как впервые слышу о них. - person Hi-Angel; 30.06.2016
comment
Клиентское приложение @Hi-Angel Perforce основано на Qt, поэтому оно работает на разных платформах, но выглядит некрасиво и плохо совместимо с различными операционными системами. - person Lex Li; 30.06.2016
comment
@LexLi ну, Skype, если уж на то пошло, написан на Qt. Это выглядит плохо? Я бы скорее предположил, что Perforce использует какую-то уродливую тему. - person Hi-Angel; 30.06.2016

У меня была такая же проблема (.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
        {

..... он попадается из другого потока и делает свою работу.

Другой подписчик также запустил событие в главной форме. Я проигнорировал это событие, и проблема ИСЧЕЗЛА.

person kpe    schedule 11.11.2013