Чтобы поместить это в контекст, по мнению многих, Java никогда не давала своего обещания "Write Once Run Anywhere".
В лучшем случае вы получили "Write Once Debug Everywhere" или "Write Once выглядит как дерьмо везде"
Все успешные приложения на основе CLR были написаны с использованием графической среды, встроенной в целевую платформу.
Например, следующие очень успешные приложения linux, написанные с использованием привязок c # к GTK, называемые GTK # и не использующие winforms, как вы ожидаете:
Banshee - музыкальный плеер типа itunes
fspot - фото менеджер
TomBoy - программа для заметок
GnomeDo - Быстрый запуск и док
Столь же успешные приложения Windows .net не пишутся с использованием GTK # (даже если это кроссплатформенное), они пишутся с использованием winforms или WPF.
Когда Google пришел к созданию Chrome, они не пытались использовать кроссплатформенную инфраструктуру графического интерфейса, вместо этого они решили использовать собственные платформы графического интерфейса на каждой платформе. Зачем? потому что таким образом приложение правильно вписывается в свою среду, таким образом оно выглядит, ощущается и действует как свой родной для операционной системы.
В основном, когда вы пытаетесь выполнить запись один раз в любом месте, вам приходится идти на серьезные компромиссы, и в результате получается то, что на самом деле ни к чему не приводит.
Индустрия в значительной степени отказалась от высокой цели написания когда-либо запущенного где-либо, как хорошей идеи, которая не сработала на практике.
Наилучшим подходом для mono / .net является совместное использование двоичных файлов более низкого уровня и использование встроенного графического интерфейса на каждой целевой платформе. GTK # на Linux, Winforms или WPF на Windows, CocoaSharp на Mac. Таким образом, ваше приложение будет выглядеть и ощущаться как собственное приложение.