¿Es posible crear una aplicación GUI de escritorio en .NET core?

103

He estado desarrollando programas WinForms durante algunos años. Ahora estoy investigando .NET Core (incluido ASP.NET Core MVC). Estoy buscando la nueva tecnología de escritorio GUI. En la actualización 3 de Visual Studio 2015, no veo ninguna opción para crear una aplicación GUI en .NET Core. ¿Qué me estoy perdiendo?

EKanadily
fuente
Deberías cambiar el ángulo al ver esta nueva plataforma. Todos los marcos existentes, WPF / WinForms / UWP / GTK # / Xamarin.Mac / iOS / Android pueden usar el código que escribe en .NET Core. Eso permite el desarrollo multiplataforma, pero no de la forma que imagina.
Lex Li
Entonces, está diciendo que puedo construir GUI en, por ejemplo, winforms y el código de back-end en .net core
EKanadily
No. Los paquetes creados en .NET Core se pueden agregar como referencias directamente.
Lex Li
1
Electron es el camino a seguir. Utilice asp.net detrás de una api. Si mantiene la lógica de la interfaz de usuario liviana, debería poder mantener la parte más importante de la aplicación en .net
user7558114
1
Como consejo profesional, actualizaría a Visual Studio 2017 (si es posible) o usaría otras herramientas que estén disponibles (la CLI y / o VS Code / Rider) porque VS 2015 no tiene acceso a las herramientas de .NET Core 2.0, que obstaculizar su desarrollo en el futuro. Incluso si todo lo que estás haciendo es experimentar con él.
Jamie Taylor

Respuestas:

66

No te faltaba nada. MS no envió una forma razonable de crear aplicaciones GUI directamente usando .Net Core hasta .Net Core 3, aunque UWP (Plataforma universal de Windows) está parcialmente construida sobre .Net Core.

.Net Core 3.0 incluye soporte para Winforms y WPF, aunque es solo para Windows.

.Net 6 incluirá .Net MAUI, que admitirá aplicaciones de escritorio y aplicaciones móviles de Windows y macOS, con aplicaciones de escritorio Linux admitidas por la comunidad (no MS). .Net 5 incluirá una versión preliminar de .Net MAUI.

Para conocer las opciones multiplataforma de terceros, consulte otras respuestas.

svick
fuente
42
¡Dios mío, eso es un shock! Entonces, ¿cuál es el punto de un marco multiplataforma que no tiene GUI?
EKanadily
19
@EssamGndelee El punto principal son las aplicaciones ASP.NET Core. Un punto secundario son las aplicaciones de consola.
svick
3
@ChristopherPainter Un mejor soporte para la computación en la nube y la atracción de desarrolladores de plataformas como Node.js son algunas de las razones por las que .Net Core existe, sí. Pero eso no significa que Microsoft se preocupe solo por ellos ahora.
svick
1
@CYoung Creo que la postura de Microsoft es que deberías usar UWP para eso.
svick
1
@svick, eso eliminaría por completo cualquier programación multiplataforma, que se suponía que debía resolver .NET Core. UWP es lo suficientemente bueno solo para la familia de EM: /
walther
43

AvaloniaUI ahora tiene soporte para ejecutarse sobre .NET Core en Win / OSX / Linux. XAML, enlaces y plantillas de control incluidos.

por ejemplo, para desarrollar en MacOs con Rider:

  1. Siga las instrucciones para instalar las nuevas plantillas de Avalonia dotnet
  2. Abra JetBrains Rider y desde la pantalla de bienvenida,
  3. Elija New Solution-> (Cerca de la parte superior de la Lista de plantillas) -> More Templates-> Botón Install Template...-> buscar el directorio donde clonó las plantillas en el paso 1.
  4. Haga clic en el Reloadbotón
  5. ¡Mirad! Las plantillas de Avalonia ahora aparecen en la New Solutionlista de plantillas.
  6. Elija una plantilla de Avalonia
  7. Construye y ejecuta. Vea la GUI abierta ante sus ojos.

GUI steps to install a dotnet new template into JetBrains Rider

kekekeks
fuente
Como acotación al margen, cualquier interesado vote por Jetbrains para incluir el soporte de Avalonia en Rider: youtrack.jetbrains.com/issue/RIDER-39247
xendi
41

Puede usar Electron y conectarlo con Edge.js resp. borde de electrones . Edge.js permite que electron (node.js) llame a .net dll y viceversa. De esta manera, puede escribir la GUI con HTML, CSS y JavaScript y el backend con .net core. Electron en sí también es multiplataforma y se basa en el navegador de cromo.

P. Wenger
fuente
5
Pero, ¿por qué el electrón? También puede abrir una aplicación web en el puerto X y luego navegar el navegador hasta allí. Incluye todo lo que puede Electron, y más porque siempre es la última versión del navegador, a diferencia de Electron. Si necesita una versión de navegador específica, incluya Google-Chrome en su distribución.
Stefan Steiger
1
@StefanSteiger Creo que usar electron y también llamar a la API directamente a través del ensamblaje llenará el vacío que el usuario no verá en la aplicación como una aplicación web. Y algunos desarrolladores no quieren agregar más capa de comunicación usando HTTP.
Brian Ng
Electron.Net parece que esto es bastante simple ahora cross-platform-blog.com/electron.net/…
J. Allen
Electron.NET parece prometedor, pero estaría cansado de usarlo en producción porque lo obliga a abrir un servidor web no seguro en su máquina de producción. Por otra parte, siempre que el extremo ASP.NET Core de la aplicación esté detrás de un servidor proxy inverso correctamente configurado como IIS o nginx (o similar), entonces debería estar más seguro.
Jamie Taylor
El infierno podría simplemente la aplicación como mvc / webapi, alojar localmente en un puerto aleatorio y usar la interfaz electrónica para llamar a la api local.
Wjdavis5
30

Ahora es posible usar Qt / QtQuick / QML con .NET Core, usando Qml.Net .

Tiene un alto rendimiento (no es "hablador"), tiene todas las funciones y funciona en Linux / OSX / Windows.

Mira mi publicación de blog para ver cómo se compara con las otras opciones que existen actualmente.

PD: soy el autor.

Paul Knopf
fuente
Parece muy prometedor, lo estaré investigando
Daniel
22

Una opción sería usar Electron con JavaScript, HTML y CSS para la interfaz de usuario y crear una aplicación de consola .Net Core que aloje automáticamente una API web para la lógica de back-end. Electron iniciará la aplicación de consola en segundo plano que expondrá un servicio en localhost: xxxx.

De esta manera, puede implementar toda la lógica de back-end usando .Net para que sea accesible a través de solicitudes HTTP desde JavaScript.

Eche un vistazo a esta publicación, explica cómo crear una aplicación de escritorio multiplataforma con Electron y .Net Core y verificar el código en github

Rui Figueiredo
fuente
17

Para crear una interfaz de usuario basada en consola, puede utilizar gui.cs . Es de código abierto (de Miguel, creador de Xamarin) y se ejecuta en .Net core en Windows, Linux y MacOs.

Tiene los siguientes componentes:

  • Botones
  • Etiquetas
  • Entrada de texto
  • Vista de texto
  • Campo de edición de tiempo
  • Botones de radio
  • Casillas de verificación
  • Cuadros de diálogo
    • Cuadros de mensaje
  • Ventanas
  • Menús
  • ListViews
  • Marcos
  • ProgressBars
  • Desplazarse por las vistas y las barras de desplazamiento
  • Visor / editor hexadecimal (HexView)

Captura de pantalla de muestra

Captura de pantalla de salida de muestra de gui.cs

Kolappan N
fuente
16

codificamos una solución de código abierto para electron con .net core: Electron.NET . https://github.com/ElectronNET/Electron.NET

¡Disfrutar!

Gregor Biswanger
fuente
15
Qué diablos. Si quiero una página HTML, haré una página HTML. Quiero algo que interactúe con el escritorio mejor que esto.
Joshua
4

tl; dr : no estoy seguro de que los desarrolladores de .NET Core puedan proporcionar un marco de interfaz gráfica de usuario multiplataforma.

Siento que esperar que se incluya un marco de interfaz gráfica de usuario multiplataforma en las herramientas oficiales (especialmente una versión anterior de las herramientas, mencionas que estás ejecutando la actualización 3 de VS 2015) para una versión anterior de .NET Core es un poco prematuro.

Los marcos de GUI son realmente bastante pesados ​​y dependen de las abstracciones de hardware que ya están presentes en la máquina host. En Windows, generalmente hay un administrador de ventanas único (WM) y un entorno de escritorio (DE) utilizado por la mayoría de los usuarios, pero en las muchas distribuciones diferentes de Linux que son compatibles, hay una cantidad de WM y DE posibles, dado que la mayoría de los usuarios lo harán utilizar X-Server o Wayland en combinación con KDE, Gnome o XFCE. Pero ninguna instalación de Linux es igual.

El hecho de que la comunidad de código abierto realmente no pueda conformarse con una configuración "estándar" para una VM y DE significa que sería bastante difícil para los desarrolladores de .NET Core crear un marco de GUI que funcione en todas las plataformas y combinaciones de DE y WM.

Mucha gente aquí tiene algunas sugerencias excelentes (desde usar ASP.NET Core para construir una aplicación web y usar un navegador hasta enumerar un montón de marcos multiplataforma). Si echa un vistazo a algunos de los marcos de GUI multiplataforma mencionados enumerados, verá lo pesados ​​que son.

Sin embargo, hay luz al final del túnel cuando Miguel de Icaza mostró Xamarin ejecutándose ingenuamente en Linux y MacOS en .NET Conf. este año (2017, si está leyendo esto en el futuro), por lo que podría valer la pena intentarlo. que cuando esté listo.

(pero deberá actualizar de VS 2015 a VS 2017 para acceder a las características de .NET Core 2.0)

Jamie Taylor
fuente
no hay razonamiento para la variedad de Linux. 1. Java se ejecuta sin problemas 2. Mono ejecuta WinForms normalmente (aunque es feo) En Linux puedes usar GTK en una distribución basada en QT y viceversa. Sería genial tener enlaces QT para .net core.
Bogdan Mart
Estoy de acuerdo con todo lo que dices. Sin embargo, creo que el enfoque de Microsoft es proporcionar IaaS (infraestructura como servicio), SaaS (software como servicio) y PaaS (plataforma como servicio) a través de su plataforma Azure en este momento. Tendría sentido que su marco multiplataforma de código abierto de primera parte apunte a los desarrolladores en esa dirección como una prioridad. El trabajo que están haciendo Azure y otras compañías como RHEL y Google para admitir tanto ASP NET Core como .NET Core es prácticamente legendario, y tiene sentido que la prioridad para .NET Core parezca reflejar eso.
Jamie Taylor
4

Estoy trabajando en un proyecto que podría ayudar: https://github.com/gkmo/CarloSharp

La siguiente aplicación está escrita en .net con la interfaz de usuario en HTML / JS / CSS (Angular)

ingrese la descripción de la imagen aquí

guilhermekmelo
fuente
1
Sin HTML, por favor.
Richard Lalancette
3

Puede desarrollar una aplicación web con .NET Core y MVC y encapsularla en una aplicación JavaScript universal de Windows: https://docs.microsoft.com/en-us/windows/uwp/porting/hwa-create-windows

Sigue siendo una aplicación web, pero es una forma muy ligera de transformar una aplicación web en una aplicación de escritorio sin tener que aprender un nuevo marco y / o volver a desarrollar la interfaz de usuario, y funciona muy bien.

El inconveniente es diferente a electron o ReactXP, por ejemplo, el resultado es una aplicación universal de Windows y no una aplicación de escritorio multiplataforma.

AdrienTorris
fuente
2

Sí, es posible.

.NET Core no tiene ningún componente para la aplicación de GUI nativa lista para usar. Sin embargo, existe un paquete NuGet que se llama Electron.NET , según la respuesta de Gregor Biswanger.

Electrón es un marco que le permite crear aplicaciones GUI nativas sobre Node.js. Electron.NET es un paquete NuGet que le permite utilizar Electron y Node.js desde su código .NET Core.

La buena noticia es que no es necesario que aprenda JavaScript, Electron o Node.js para poder utilizar el paquete NuGet. Los archivos JS se ejecutan dentro de su aplicación, pero el proceso de compilación los genera automáticamente.

Todo lo que debe hacer es crear una aplicación ASP.NET Core MVC bastante estándar. La única diferencia es que, en lugar de ejecutarse en el navegador, se ejecuta como una aplicación nativa con ventana. Además de unas pocas líneas de código específicas del paquete Electron.NET, no necesitará aprender nada por encima de ASP.NET Core MVC.

Esta página proporciona un tutorial sobre cómo usarlo. También contiene algunos enlaces a repositorios de código de muestra.

Fiodar Sazanavets
fuente
2

Nigromante.
Para el caso especial de las aplicaciones WinForms existentes :

hay una manera, aunque no sé qué tan bien funciona.
Es así:
Tome la implementación de WinForms de mono.
Portelo a .NET Core o NetStandard.

Vuelva a compilar sus aplicaciones WinForms con el nuevo System.Windows.Forms.
Arregle cualquier cosa que NetCore pueda romper.
Ore para que mono implemente las piezas que necesita sin problemas.
(si no es así, siempre puede dejar de orar y enviar al mono-proyecto una solicitud de extracción con su corrección / parche / función)

Aquí está mi repositorio de CoreFX WinForms:
https://github.com/ststeiger/System.CoreFX.Forms

Stefan Steiger
fuente
1

Es una pregunta antigua, pero sí, es posible desarrollar aplicaciones de escritorio multiplataforma (GUI), para Windows, Linux y macOS, usando VSCode, .Net Core, C #, gtk3, gtksharp y Glade como GUI Designer.

He aquí cómo .

Teo Bebekis
fuente
0

Si usa .Net Core 3.0y superior, siga los siguientes pasos y estará listo para comenzar: (Voy a usar la CLI de .NET Core , pero también puede usar Visual Studio)

  1. md MyWinFormsApp paso opcional
  2. cd MyWinFormsApp paso opcional
  3. dotnet new sln -n MyWinFormsApp paso opcional, pero es una buena idea
  4. dotnet new winforms -n MyWinFormsApp Lo siento, esto no es opcional
  5. dotnet sln add MyWinFormsApp haz esto si hiciste el paso # 3

Bien, puede dejar de leer mi respuesta y comenzar a agregar código al MyWinFormsAppproyecto. pero si quieres trabajar con Form Designer, sigue leyendo.

  1. Abra el MyWinFormsApp.csprojarchivo y cambie <TargetFramework>netcoreapp3.1<TargetFramework>a <TargetFrameworks>net472;netcoreapp3.1</TargetFrameworks>(si está usando netcoreapp3.0, no se preocupe, cámbielo a <TargetFrameworks>net472;netcoreapp3.0</TargetFrameworks>)
  2. Luego agrega lo siguiente ItemGroup
  <ItemGroup Condition="'$(TargetFramework)' == 'net472'">
    <Compile Update="Form1.cs">
      <SubType>Form</SubType>
    </Compile>
    <Compile Update="Form1.Designer.cs">
      <DependentUpon>Form1.cs</DependentUpon>
    </Compile>
  </ItemGroup>

Después de realizar estos pasos, esto es con lo que debería terminar:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFrameworks>net472;netcoreapp3.1</TargetFrameworks>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net472'">
    <Compile Update="Form1.cs">
      <SubType>Form</SubType>
    </Compile>
    <Compile Update="Form1.Designer.cs">
      <DependentUpon>Form1.cs</DependentUpon>
    </Compile>
  </ItemGroup>

</Project>
  1. Abra Program.csy agregue el siguiente preprocesador-si
#if NETCOREAPP3_1
    Application.SetHighDpiMode(HighDpiMode.SystemAware);
#endif

Ahora puede abrir el MyWinFormsAppproyecto usando Visual Studio 2019 ( creo que también puede usar Visual Studio 2017, pero no estoy seguro ) y haga doble clic en Form1.csy debería ver esto:

ingrese la descripción de la imagen aquí

Bien, abra Toolbox ( Ctrl+W,X) y comience a agregar controles a su aplicación y hágala bonita.

Puede leer más sobre el diseñador en Windows Forms .NET Core Designer

Mehdi Dehghani
fuente