.net linux mono

Ejecutando una aplicación.NET en Linux en 2015



mono (1)

TL; DR: ¿cuáles son las opciones actuales para ejecutar una solución VS2015 en Linux?

Tengo una aplicación .NET que funciona bien en Windows y he recibido solicitudes para portarla a Linux. Me he esforzado mucho por entender lo que significó hoy en 2015, pero estoy realmente confundido con todas las publicaciones anteriores que apuntan a Mono y las nuevas publicaciones que hablan sobre vNext (y aún menciono a Mono). También tengo buenos antecedentes con .NET pero no sé mucho sobre Linux en general ...

Seguí un tutorial reciente y logré compilar y ejecutar una aplicación de consola Hello World en Linux. Eso requirió una instalación de cosas que no conozco, incluido Mono, y luego ejecutar algunos comandos "k" (kpm restore, kpm build, k run). Sin embargo, ahora no sé cómo pasar a mi caso real.

Tengo una solución VS2015 que tiene muchos proyectos, pero solo 4 son dignos de mencionar aquí: - CommonStuff - ServiceCore - ServiceWindows / ServiceConsole

Todo el código está en el proyecto ServiceCore (biblioteca de clases), que a su vez tiene una referencia a CommonStuff (otra biblioteca de clases). ServiceWindows es un proyecto de servicio de Windows que simplemente llama a la función principal de ServiceCore, y ServiceConsole hace lo mismo pero en una aplicación de consola (por razones de depuración, ya que no es posible depurar un proyecto de servicio de Windows desde Visual Studio).

Tanto CommonStuff como ServiceCore incluyen una gran cantidad de bibliotecas .NET, así como algunas DLL de terceros. Sin embargo, no hay un código específico de Windows, no hay pinvoke o cosas funky.

Si consideramos que ServiceConsole se convierta en la aplicación que deseo ejecutar en Linux, ¿qué debo hacer para que esto suceda? Compilar Hello World fue una cosa, pero ahora, con todas estas referencias ... No sé por dónde empezar. Además, ni siquiera puedo tener el código para compilar en Linux (código propietario), por lo que necesito que el código se compile en Windows y que el dll / exe compilado se ejecute directamente en Linux. ¿Es eso algo posible? He visto algunas publicaciones que dicen que Mono puede ejecutar aplicaciones compiladas, pero cada uno de los Mono turorial que he visto comienza con la compilación. Además, no estoy seguro de qué es este vNext. Leí cosas sobre la capacidad de ejecutar código en Linux si está dirigido a .net 6 ... pero no tengo idea de cómo o qué significa.

Apreciaría enormemente si alguien pudiera tomarse un tiempo para explicar en detalle cuáles son las opciones actuales y si es realista para una aplicación profesional o si solo es bueno para Hello Worlds todavía.

Gracias

EDIT: Ok, parece que puedo compilar mi código en VS y de alguna manera ejecutarlo en Linux usando Mono, ¿cómo?


A menudo desarrollo aplicaciones complejas multiplataforma o solo de Linux, utilizando Visual Studio 2015 en Windows. Simplemente puede compilarlo en VS, copiarlo a Linux y ejecutarlo, casi siempre esto solo funcionará. Si realiza un desarrollo serio, es posible que desee compilar en mono para detectar algunos métodos faltantes y diferentes firmas, pero eso no es necesario .

Ahora, el servicio de Windows se puede cambiar a solo la aplicación de consola. Básicamente es solo una aplicación de consola gestionada por una herramienta externa. En Linux hay diferentes herramientas que le permiten administrar (iniciar / detener / reiniciar en caso de fallo, etc.) sus aplicaciones de "servicio".

Para aplicaciones web, normalmente uso ServiceStack, que se ejecuta en mono sin problemas. Incluso puede auto hospedarlo nuevamente como aplicación de consola, detrás de nginx. También puede alojar aplicaciones asp.net bajo apache / nginx, con pocos o ningún cambio de código.

Hace medio año, "porté" el gran proyecto que se desarrolló durante 2 años desde el servidor de Windows al servidor CentOS 7, principalmente mediante la copia de material en centos y en ejecución (con muy pocos cambios, sin recompilación en mono). Por supuesto, ese proyecto tenía muchas dependencias de terceros, y algunos desarrolladores de esas dependencias ni siquiera sabían que existe mono. Sin embargo ellos simplemente trabajaron. Y esa solución tenía unos 90 proyectos VS.

Por supuesto, no todos los proyectos complejos son tan fáciles de portar, especialmente si usa bibliotecas nativas a menudo, pero generalmente ese no es el caso. Además, si trabaja con el servidor SQL, tenga en cuenta que el controlador del servidor SQL en mono es bastante malo desde mi experiencia. Uso postgre y evito el servidor sql con mono si tengo una opción. Trabajar con imágenes en mono tampoco es muy bueno, tiene errores y es inestable. Evito usar la clase Bitmap allí a toda costa y, en cambio, pinvoke en imagemagick C api. Pero debe hacerlo allí solo si realiza imágenes serias y extensas, para tareas básicas está bien.

Larga historia corta: ejecutar una aplicación .NET en Linux en 2015 no es un problema hoy en día.

Actualizar. Si ya está en 2018, casi no hay razón para usar mono en linux, además de casos específicos como el desarrollo de aplicaciones móviles con Xamarin, el desarrollo de juegos con Unity o la aplicación de interfaz de usuario. Si solo necesita una consola / aplicación de servicio regular (incluido el servidor web), use .NET Core. Ya es estable y lo suficientemente rápido para el uso en producción, y desde mi experiencia, ya es mucho menos con errores que el mono incluso. La transferencia de su aplicación .NET / mono completa a .NET Core es en la mayoría de los casos relativamente sencilla, aunque es posible que ciertas bibliotecas aún no estén disponibles en la nueva plataforma. Pero si está comenzando un nuevo proyecto, elija .NET Core sin duda.