Pregunta

Alguien ha utilizado Mono, el código abierto .NET aplicación en una gran o mediana proyecto?Me pregunto si está listo para el mundo real, los entornos de producción.Es estable, rápido, compatible, ...lo suficiente como para utilizar?Se tarda un montón de esfuerzo para proyectos de puertos para el Mono runtime, o es que realmente, realmente compatible solo basta con tomar y ejecutar ya se ha escrito el código de tiempo de ejecución de Microsoft?

¿Fue útil?

Solución

Hay un par de escenarios a considerar:(a) si usted está portando una aplicación existente y se preguntaba si el Mono es lo suficientemente bueno para esta tarea;(b) que están empezando a escribir algo de código, y desea saber si el Mono es lo suficientemente maduro.

Para el primer caso, puede utilizar la Mono de Migración de la herramienta Analizador de (Moma) para evaluar hasta qué punto la aplicación se ejecuta en Mono.Si la evaluación viene de vuelta con el vuelo de colores, usted debe comenzar con las pruebas y de control de calidad y conseguir listo para el envío.

Si su evaluación viene de vuelta con un informe que destaca las características que faltan o que se diferencian significativamente en cuanto a su semántica en Mono, usted tendrá que evaluar si el código puede ser adaptado, reescrito, o en el peor de los casos, si su aplicación puede trabajar con funcionalidad reducida.

De acuerdo a nuestra Moma de las estadísticas basadas en los envíos de usuario (esto es de memoria) aproximadamente el 50% de las solicitudes de trabajo fuera de la caja, alrededor de 25% requieren de una semana de trabajo vale la pena (refactorización, la adaptación) otro 15% requieren de un compromiso serio para rehacer trozos de código, y el resto es simplemente no vale la pena molestar a la portabilidad, ya que son tan increíblemente atado para Win32.En ese momento, ya sea de empezar desde cero, o una decisión de negocios va a conducir el esfuerzo para hacer que tu código sea portátil, pero estamos hablando de meses de trabajo vale la pena (al menos a partir de los informes que tenemos).

Si usted está comenzando desde cero, la situación es mucho más sencillo, ya que sólo va a utilizar el Api que están presentes en Mono.Mientras usted permanezca con la ayuda de la pila (que es bastante .NET 2.0, además de los principales mejoras en 3.5 incluyendo LINQ y del Sistema.Núcleo, además de cualquier Mono de la cruz-plataforma Api) que va a estar bien.

Cada de vez en cuando puede tener errores en Mono o limitaciones, y usted podría tener que trabajar alrededor de ellos, pero que no es diferente que cualquier otro sistema.

Como para la portabilidad:ASP.NET las aplicaciones son los más fáciles de puerto, como los que tienen poco o nada de las dependencias en Win32 y usted puede incluso utilizar SQL server u otras bases de datos populares (hay un montón de proveedores de bases de datos incluido con Mono).

Windows.Formas de portar a veces es más difícil porque los desarrolladores como para escapar de la .NETO de la caja de arena y P/Invoke sus sesos para configurar cosas tan útil como la de cambiar el cursor parpadeando tasa se expresa como dos puntos de bézier codificados en BCD forma en un wParam.O alguna basura como esa.

Otros consejos

Tiene bastante extensa cobertura .NET 4.0 y hasta incluyen algunas características de la .NET 4.5 Api, pero hay un par de áreas en las que hemos optado por no aplicar debido a la Api de ser despreciado, nuevas alternativas que se crea o el alcance demasiado grande.Las siguientes Api no están disponibles en Mono:

  • Windows Presentation Foundation
  • Windows Workflow Foundation (ninguna de las dos versiones)
  • Entity Framework
  • El WSE1/WSE2 "add-ons" para los Servicios Web estándar de la pila

Además, nuestro WCF, su aplicación es limitada a lo que Silverlight compatibles.

La forma más sencilla de comprobar su proyecto específico es ejecutar el Mono De Migración Analyzer (MoMA).El beneficio es que se le notificará el Mono del equipo de las cuestiones que se evitará el uso de Mono (si alguna), lo que les permite dar prioridad a su trabajo.

Hace poco me encontré con el MoMA en Subsónicos y encontró sólo un problema - un extraño uso de tipos que aceptan valores null.Esa es una gran base de código, de modo que la cobertura no era bastante impresionante.

Mono está en uso activo en varios comerciales así como productos de código abierto.Ya está en uso en algunas aplicaciones de gran tamaño, tales como Wikipedia y el Mozilla Developer Center, y que ha sido utilizado en aplicaciones tales como los reproductores MP3 Sansa y poderes miles de juegos publicados.

En el nivel de la lengua, el Mono compilador es totalmente compatible con el C# 5.0 especificación del lenguaje.

En el escritorio lado, Mono funciona muy bien si usted se compromete a utilizar GTK#.El De Windows.Formularios de la aplicación aún es un poco buggy (por ejemplo, TrayIcon no de trabajo), pero ha recorrido un largo camino.Además, GTK# es un mejor conjunto de herramientas de Formularios Windows forms como es.

En la web de lado, Mono ha implementado suficiente de ASP.NET para ejecutar la mayoría de los sitios perfectamente.La dificultad aquí es encontrar un host que tiene mod_mono instalado en apache, o hacerlo usted mismo si usted tiene acceso shell a su anfitrión.

De cualquier manera, el Mono es ideal y estable.

Puntos clave para recordar a la hora de crear una plataforma cruzada programa:

  • El uso de GTK# en lugar de Windows.Formas
  • Garantizar adecuadamente el caso de los nombres de archivo
  • Uso Path.Separator en lugar de escribir "\", también el uso de Environment.NewLine en lugar de "\n".
  • No utilice P/Invoca las llamadas a la API de Win32.
  • No utilice el Registro de Windows.

Yo personalmente uso Mono en un primer tiempo de env.Corro mono servidores de tratar con giga-bytes de la udp/tcp de procesamiento de datos relacionados con las tareas y no podría estar más feliz.

Hay peculiaridades, y una de las cosas más molestas es que solo no puede "construir" su msbuild archivos debido a la Mono estado actual:

  • MonoDevelop (el IDE) tiene algunas parcial de msbuild apoyo, pero básicamente bork en "REAL" construir conf más allá de un simple hola mundo (generación personalizada de tareas, la dinámica de "propiedades" como $(SolutionDir), configuración real a nombre de un par de callejones sin salida)
  • xbuild que DEBERÍA haber sido el mono-abastecimiento de msbuild-totalmente compatible con la construcción del sistema es aún más horrible, así que la construcción de la línea de comandos es en realidad una peor experiencia de uso de la interfaz gráfica de usuario, que es muy "poco ortodoxa" estado de la unión para entornos Linux...

Una vez Durante conseguir tus cosas realmente CONSTRUIDO, usted puede ver algunos de los páramos incluso para el código que DEBE ser apoyada como:

  • el compilador llegar hallan roto en ciertas construcciones
  • y cierto más avanzado/nuevo .NET clases tirar de la onu-espera mierda a usted (XLinq a nadie?)
  • algunos inmaduros en tiempo de ejecución "características" (3GB montón límite EN x64...WTF!)

pero agitado dijo que, en general, las cosas empiezan a trabajar muy rápidamente, y soluciones/soluciones son abundantes.

Una vez que hemos repasado los primeros obstáculos, mi experiencia es que el mono de las ROCAS, y sigue mejorando con cada iteración.

He tenido servidores que ejecutan con mono, el procesamiento de 300 gb de datos por día, con toneladas de p/invoke y en general de hacer un MONTÓN de trabajo y mantenerse durante 5-6 meses, incluso con el "bleeding edge" mono.

Espero que esto ayude.

Las recomendaciones para la aceptación de respuesta son un poco fuera de fecha, ahora.

  • Los formularios windows forms aplicación es bastante buena ahora.(Ver Pintura-Mono para un puerto de Paint.net que es una situación muy involucrado aplicación de Windows forms.Todo lo que se necesitaba era una capa de emulación para algunos de los P-Invocar y no admitidos de las llamadas al sistema).
  • Ruta de acceso.Se combinan así como la Ruta de acceso.Separador para unirse a las rutas y nombres de archivo.
  • El Registro de windows está bien, siempre y cuando sólo estás usando para almacenar y recuperar los datos de sus aplicaciones (es decir,usted no puede obtener ninguna información acerca de Windows de la misma, ya que es básicamente un registro de Mono aplicaciones).

Si desea utilizar WPF que'rr de suerte Mono actualmente no tiene planes de implementar.

http://www.mono-project.com/WPF

Así, el mono es ideal, pero por lo que puedo ver, es inestable.Funciona, pero los fallos cuando se dan mono proceso de un trabajo serio que hacer.

TL;DR - no utilice mono si :

  • el uso de dominios de aplicación (Asamblea de Carga\Descargar) en entornos multiproceso
  • No puede sostener la 'let-it-fail' modelo
  • Experiencia ocasional de la pesada carga de los acontecimientos durante el proceso de ejecución de

Así, los hechos.

Utilizamos mono-2.6.7 (.net v 3.5) en RHEL5, Ubuntu, y, para mi punto de vista, es más estable que la versión construida por Novell.Tiene un problema con la Descarga de dominios de aplicación (segfaults), sin embargo, se produce un error muy raro y esto, por el momento, es aceptable (por nosotros).

Bien.Pero si usted desea utilizar las funciones de .net 4.0, usted tiene que cambiar a versiones 2.10.x o 3.x, y es ahí donde comienzan los problemas.

En comparación con 2.6.7, las nuevas versiones son inaceptables para ser utilizado.Escribí una simple prueba de estrés de la aplicación de las pruebas mono instalaciones.

Es aquí, con instrucciones de uso : https://github.com/head-thrash/stress_test_mono

Se utiliza el grupo de subprocesos Subprocesos de trabajo.Trabajador de la carga de la dll a AppDomain y trata de hacer algo de matemáticas de trabajo.Algunos de los trabajos es de muchos de rosca, algo único.Casi todo el trabajo es dependiente de CPU, aunque hay algunas lecturas de los archivos del disco.

Los resultados no son muy buenas.De hecho, para la versión 3.0.12:

  • sgen GC segfaults proceso casi inmediatamente
  • mono con boehm vive más tiempo (de 2 a 5 horas), pero finalmente segfaults

Como se mencionó anteriormente, sgen gc simplemente no funciona (mono construido a partir de la fuente):

* Assertion: should not be reached at sgen-scan-object.h:111

Stacktrace:


Native stacktrace:

    mono() [0x4ab0ad]
    /lib/x86_64-linux-gnu/libpthread.so.0(+0xfcb0) [0x2b61ea830cb0]
    /lib/x86_64-linux-gnu/libc.so.6(gsignal+0x35) [0x2b61eaa74425]
    /lib/x86_64-linux-gnu/libc.so.6(abort+0x17b) [0x2b61eaa77b8b]
    mono() [0x62b49d]
    mono() [0x62b5d6]
    mono() [0x5d4f84]
    mono() [0x5cb0af]
    mono() [0x5cb2cc]
    mono() [0x5cccfd]
    mono() [0x5cd944]
    mono() [0x5d12b6]
    mono(mono_gc_collect+0x28) [0x5d16f8]
    mono(mono_domain_finalize+0x7c) [0x59fb1c]
    mono() [0x596ef0]
    mono() [0x616f13]
    mono() [0x626ee0]
    /lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a) [0x2b61ea828e9a]
    /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x2b61eab31ccd]

Como para boehm segfauls - por ejemplo (Ubuntu 13.04, mono construido a partir de la fuente):

mono: mini-amd64.c:492: amd64_patch: Assertion `0' failed.
Stacktrace:
at <unknown> <0xffffffff>
at System.Collections.Generic.Dictionary`2.Init (int,System.Collections.Generic.IEqualityComparer`1<TKey>) [0x00012] in /home/bkmz/my/mono/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:264
at System.Collections.Generic.Dictionary`2..ctor () [0x00006] in /home/bkmz/my/mono/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:222
at System.Security.Cryptography.CryptoConfig/CryptoHandler..ctor (System.Collections.Generic.IDictionary`2<string, System.Type>,System.Collections.Generic.IDictionary`2<string, string>) [0x00014] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/Crypto
Config.cs:582
at System.Security.Cryptography.CryptoConfig.LoadConfig (string,System.Collections.Generic.IDictionary`2<string, System.Type>,System.Collections.Generic.IDictionary`2<string, string>) [0x00013] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/CryptoCo
nfig.cs:473
at System.Security.Cryptography.CryptoConfig.Initialize () [0x00697] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:457
at System.Security.Cryptography.CryptoConfig.CreateFromName (string,object[]) [0x00027] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:495
at System.Security.Cryptography.CryptoConfig.CreateFromName (string) [0x00000] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:484
at System.Security.Cryptography.RandomNumberGenerator.Create (string) [0x00000] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/RandomNumberGenerator.cs:59
at System.Security.Cryptography.RandomNumberGenerator.Create () [0x00000] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/RandomNumberGenerator.cs:53
at System.Guid.NewGuid () [0x0001e] in /home/bkmz/my/mono/mcs/class/corlib/System/Guid.cs:492

O (RHEL5, mono es tomado de rpm aquí ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home%3A/vmas%3A/mono-centos5)

Assertion at mini.c:3783, condition `code' not met
Stacktrace:
at <unknown> <0xffffffff>
at System.IO.StreamReader.ReadBuffer () [0x00012] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.IO/StreamReader.cs:394
at System.IO.StreamReader.Peek () [0x00006] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.IO/StreamReader.cs:429
at Mono.Xml.SmallXmlParser.Peek () [0x00000] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/Mono.Xml/SmallXmlParser.cs:271
at Mono.Xml.SmallXmlParser.Parse (System.IO.TextReader,Mono.Xml.SmallXmlParser/IContentHandler) [0x00020] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/Mono.Xml/SmallXmlParser.cs:346
at System.Security.Cryptography.CryptoConfig.LoadConfig (string,System.Collections.Generic.IDictionary`2<string, System.Type>,System.Collections.Generic.IDictionary`2<string, string>) [0x00021] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptog
raphy/CryptoConfig.cs:475
at System.Security.Cryptography.CryptoConfig.Initialize () [0x00697] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:457
at System.Security.Cryptography.CryptoConfig.CreateFromName (string,object[]) [0x00027] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:495
at System.Security.Cryptography.CryptoConfig.CreateFromName (string) [0x00000] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:484
at System.Security.Cryptography.RandomNumberGenerator.Create (string) [0x00000] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptography/RandomNumberGenerator.cs:59
at System.Security.Cryptography.RandomNumberGenerator.Create () [0x00000] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptography/RandomNumberGenerator.cs:53
at System.Guid.NewGuid () [0x0001e] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System/Guid.cs:483
at System.Runtime.Remoting.RemotingServices.NewUri () [0x00020] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Runtime.Remoting/RemotingServices.cs:356
at System.Runtime.Remoting.RemotingServices.Marshal (System.MarshalByRefObject,string,System.Type) [0x000ba] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Runtime.Remoting/RemotingServices.cs:329
at System.AppDomain.GetMarshalledDomainObjRef () [0x00000] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System/AppDomain.cs:1363

Tanto los fracasos como de alguna manera están conectados a los dominios de aplicación de la lógica, así que usted debe permanecer lejos de ellos en mono.

Por CIERTO, prueba el programa trabajó 24 horas en la máquina Windows en MS .NET 4.5 env sin ningún error.

Así que, en conclusión, me gustaría decir - el uso de mono con precaución.Se trabaja a partir de la primera vista, pero pueden fallar con facilidad, siempre.Te gustaría quedar con un montón de volcados de núcleo importante de la fe y de la pérdida en proyectos de software libre.

El MoMA es una gran herramienta para esto, como alguien sugirió.Las principales fuentes de la incompatibilidad de estos días son las aplicaciones que DllImport (o P/Invoke) en Win32 bibliotecas.Algunas asambleas no se implementan, pero la mayoría de ellos son sólo para Windows y realmente no tendría sentido en Linux.Creo que es bastante seguro decir que la mayoría de los ASP.NET las aplicaciones se pueden ejecutar en Mono con modificaciones limitadas.

(Revelación:He contribuido a Mono, así como en la escrita aplicaciones que se ejecutan en la parte superior de la misma.)

En muchos casos, usted puede tomar el código existente y sólo se ejecuta en Mono, especialmente si va a trasladar un ASP.NET aplicación.

En algunos casos, puede que necesite toda la nuevas secciones de código para que funcione.Si el uso del Sistema.Windows.Formas, por ejemplo, la aplicación no funcionará sin modificar.Del mismo modo, si el uso de cualquier específicos de Windows (código de registro código de acceso, por ejemplo).Pero creo que el peor delincuente de interfaz de usuario código.Eso es especialmente grave en los sistemas Macintosh.

Hemos estado usando para un proyecto aquí en el trabajo que sea necesario para que se ejecute en Linux, pero la reutilización de algunos .RED de bibliotecas que hemos construido en C++Administrado.He quedado muy sorprendido de lo bien que ha funcionado.Nuestro ejecutable principal está escrito en C# y sólo tenemos referencia de nuestro Managed C++ binarios con ningún problema.La única diferencia en el código de C# entre Windows y Linux es puerto serie RS232 código.

El único gran problema que puede pensar en que ocurrió hace aproximadamente un mes.El Linux construir tenido una pérdida de memoria que no fue visto en el Windows construir.Después de hacer algún manual de depuración (el básico de los perfiladores de Mono en Linux no ayuda mucho), hemos sido capaces de reducir el tema a un determinado fragmento de código.Terminamos de remendar una solución, pero todavía tengo que encontrar algo de tiempo para volver atrás y averiguar cuál es la causa raíz de la fuga.

¿Sabe usted cómo buen Mono 2.0 de vista previa de apoyo es para Windows Forms 2.0?

De lo poco que he jugado con él, parecía relativamente completa y casi utilizable.No tenía bastante correcto en algunos lugares y todavía está un poco golpeado o se pierda en general.Me asombraba que funcionaba tan bien como lo hizo con algunos de nuestros formularios, aunque sinceramente.

Sí, definitivamente lo es (si es de cuidado, sin embargo) Apoyamos Mono en la Ar-Ajax (Ajax encontrar en la biblioteca http://ra-ajax.org) y estamos en su mayoría no tener problemas en absoluto.Usted necesita tener cuidado con algunos de los "más loco cosas .Net como WSE etc, y también, probablemente, bastante algunos de los proyectos existentes no será 100% compatible con Mono, pero los nuevos proyectos si los prueba durante el desarrollo de la mayoría será compatible sin problemas con el Mono.Y la ganancia de apoyo a Linux, etc mediante el uso de Mono es genial ;)

Una gran parte del secreto de apoyo a Mono creo que es el uso de las herramientas correctas desde el principio, por ejemplo,ActiveRecord, log4net, ra-ajax, etc...

Para el tipo de aplicación que estamos construyendo Mono por desgracia no parece listo para la producción.Nos quedamos impresionados con lo global, e impresionado con su rendimiento tanto en Windows y en EC2 máquinas, sin embargo, nuestro programa se estrelló consistenly con la recolección de basura errores en Windows y linux.

El mensaje de error es:"errores fatales en GC:demasiados montón de secciones", aquí hay un enlace a alguien experimentando el problema en una forma ligeramente diferente:

http://bugzilla.novell.com/show_bug.cgi?id=435906

El primer fragmento de código que hicimos en el Mono era un simple desafío de programación hemos desarrollado...El código de carga de aproximadamente 10 mb de datos en algunas estructuras de datos (por ejemplo,HashSets), entonces se ejecuta 10 consultas de datos.Corrimos las consultas de 100 veces en orden a tiempo y obtener un promedio.

El código se estrelló alrededor de la 55ª edición de la consulta en Windows.En linux funcionó, pero tan pronto como nos mudamos a un mayor conjunto de datos, que se estrellara demasiado.

Este código es muy simple, por ejemplo,poner algunos datos en HashSets y, a continuación, consulta los HashSets etc, todos nativos de c#, nada peligroso, no hay llamadas a la API.En Microsoft CLR nunca se bloquea, y se extiende sobre grandes conjuntos de datos de 1000 veces bien.

Uno de nuestros chicos por correo electrónico de Miguel, y que incluía el código que causó el problema, sin respuesta aún.:(

También parece que muchas otras personas se han encontrado con este problema sin solución, una solución que ha sido sugerido para volver a compilar Mono con diferentes GC ajustes, pero que sólo aparece para aumentar el umbral antes de que se estrelle.

Acabo de comprobar www.plasticscm.com.Todo (cliente, servidor, la interfaz gráfica, la combinación de herramientas) está escrito en mono.

Realmente depende de los espacios de nombres y clases que se están utilizando desde el .NET framework.Yo tenía interés en la conversión de uno de mis servicios de windows para ejecutarse en mi servidor de correo electrónico, que es Suse, pero nos encontramos con varias duro barricadas con las Api que no habían sido implementadas en su totalidad.Hay un gráfico que en algún lugar en el Mono sitio web que enumera todas las clases y su nivel de cumplimiento.Si su aplicación está cubierta, a continuación, ir a por ello.

Como cualquier otra aplicación, hacer prototipos y pruebas antes de hacer un compromiso, por supuesto.

Otro problema que nos encontramos es un programa con licencia:si se hace referencia a alguien de la DLL, no se puede codificar su camino alrededor de las incompatibilidades que están enterrados en la asamblea.

Me imagino que luego, si tienes una aplicación con algunos 3ª parte de los componentes puede ser de peluche.Dudo que muchos de los vendedores se desarrollan con el Mono en la mente

Ejemplo: http://community.devexpress.com/forums/p/55085/185853.aspx

No, el mono no está listo para el trabajo serio.He escrito un par de programas en Windows mediante F# y corriendo en Mono.Los programa utilizado en disco, memoria y cpu muy intensamente.Vi a los accidentes en el mono bibliotecas (código administrado), accidentes en código nativo y se bloquea en la máquina virtual.Cuando mono trabajado los programas, al menos, dos veces más lento que en .Net en Windows y se utiliza mucho más la memoria.Manténgase alejado de mono para un trabajo serio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top