É possível fazer um aplicativo de desktop GUI no .NET core?

101

Tenho desenvolvido programas WinForms há alguns anos. Agora estou olhando para o .NET Core (incluindo ASP.NET Core MVC). Estou procurando a nova tecnologia de desktop GUI. Na atualização 3 do Visual Studio 2015, não consigo ver nenhuma opção para fazer um aplicativo GUI no .NET Core. o que estou perdendo?

EKanadily
fonte
Você deve mudar o ângulo vendo esta nova plataforma. Todas as estruturas existentes, WPF / WinForms / UWP / GTK # / Xamarin.Mac / iOS / Android, podem usar o código que você escreve no .NET Core. Isso permite o desenvolvimento de plataforma cruzada, mas não da maneira que você imagina.
Lex Li
Então você está dizendo que eu posso construir GUIs em -por exemplo- winforms e o código de back-end em .net core
EKanadily
não. Os pacotes criados no .NET Core podem ser adicionados como referências diretamente.
Lex Li
1
O elétron é o caminho a seguir. Use asp.net atrás de uma API. Se você mantiver a luz lógica da interface do usuário, deverá ser capaz de manter a parte mais importante do aplicativo no .net
usuário7558114
1
Como dica profissional, eu atualizaria para o Visual Studio 2017 (se possível) ou usaria outras ferramentas disponíveis (o CLI e / ou VS Code / Rider) porque o VS 2015 não tem acesso às ferramentas do .NET Core 2.0, que atrapalhar seu desenvolvimento daqui para frente. Mesmo que tudo o que você esteja fazendo seja experimentando.
Jamie Taylor

Respostas:

64

Você não estava perdendo nada. A MS não lançou nenhuma maneira razoável de criar aplicativos GUI diretamente usando .Net Core até .Net Core 3, embora UWP (Plataforma Universal do Windows) seja parcialmente construída sobre .Net Core.

.Net Core 3.0 inclui suporte para Winforms e WPF, embora seja apenas para Windows.

.Net 6 incluirá .Net MAUI, que oferecerá suporte a aplicativos de desktop e aplicativos móveis do Windows e macOS, com aplicativos de desktop Linux suportados pela comunidade (não MS). .Net 5 incluirá uma versão prévia do .Net MAUI.

Para opções de plataforma cruzada que surgiram nos últimos 2 anos, veja outras respostas.

Svick
fonte
41
omg, isso é um choque! então, qual é o ponto de uma estrutura de plataforma cruzada que não tem GUI?
EKanadily
19
@EssamGndelee O ponto principal são os aplicativos ASP.NET Core. Um ponto secundário são os aplicativos de console.
svick
3
@ChristopherPainter Melhor suporte para computação em nuvem e atrair desenvolvedores de plataformas como Node.js são algumas das razões pelas quais .Net Core existe, sim. Mas isso não significa que a Microsoft se preocupe apenas com eles agora.
svick
1
@CYoung Acho que a posição da Microsoft é que você deveria usar UWP para isso.
svick
1
@svick, isso eliminaria completamente qualquer programação de plataforma cruzada que o .NET Core deveria resolver. UWP é bom o suficiente apenas para a família MS: /
walther
41

Você pode usar Electron e conectá -lo com Edge.js resp. elétron-borda . Edge.js permite que o elétron (node.js) chame .net dll e vice-versa. Desta forma, você pode escrever a GUI com HTML, CSS e JavaScript e o back-end com núcleo .net. O elétron em si também é multiplataforma e baseado no navegador chromium.

P. Wenger
fonte
5
Mas por que elétron? Você também pode simplesmente abrir um aplicativo da web na porta X e navegar até lá no navegador. Inclui tudo o que o Electron pode, e mais porque essa é sempre a versão mais recente do navegador - ao contrário do Electron. Se você precisar de uma versão específica do navegador, inclua o Google-Chrome em sua distribuição.
Stefan Steiger
1
@StefanSteiger Acho que usar o elétron e também chamar a API diretamente por meio do assembly preencherá a lacuna de que o usuário não verá o aplicativo como um aplicativo da web. E alguns desenvolvedores não querem adicionar mais camada de comunicação usando HTTP.
Brian Ng
Electron.Net parece muito simples agora cross-platform-blog.com/electron.net/…
J. Allen
O Electron.NET parece promissor, mas eu ficaria cansado de usá-lo na produção porque ele força você a abrir um servidor web não seguro em sua máquina de produção. Então, novamente, contanto que o final do ASP.NET Core do aplicativo esteja atrás de um servidor proxy reverso configurado corretamente como IIS ou nginx (ou semelhante), você deve estar mais seguro.
Jamie Taylor
o inferno poderia apenas o aplicativo como um mvc / webapi, hospedar localmente em uma porta aleatória e usar a interface de elétron chamando api local.
Wjdavis5
40

AvaloniaUI agora tem suporte para rodar no .NET Core no Win / OSX / Linux. XAML, associações e modelos de controle incluídos.

por exemplo, para desenvolver em MacOs com Rider:

  1. Siga as instruções para instalar os novos modelos do Avalonia dotnet
  2. Abra o JetBrains Rider e, na tela de boas-vindas,
  3. Escolha New Solution-> (próximo ao topo da Lista de modelos) -> More Templates-> Botão Install Template...-> navegue até o diretório onde você clonou os modelos na etapa 1.
  4. Clique no Reloadbotão
  5. Ver! Modelos Avalonia agora aparecem na New SolutionLista de Modelos!
  6. Escolha um modelo Avalonia
  7. Construa e execute. Veja a GUI aberta diante de seus olhos.

Etapas da GUI para instalar um novo modelo dotnet no JetBrains Rider

kekekeks
fonte
30

Agora é possível usar Qt / QtQuick / QML com .NET Core, usando Qml.Net .

É altamente performant (não "pinvoke chatty"), cheio de recursos e funciona em Linux / OSX / Windows.

Confira a postagem do meu blog para ver como ele se compara às outras opções disponíveis atualmente.

PS: Eu sou o autor.

Paul Knopf
fonte
Parece muito promissor, estarei investigando
Daniel,
22

Uma opção seria usar Electron com JavaScript, HTML e CSS para IU e construir um aplicativo de console .Net Core que irá hospedar uma API da web para lógica back-end. O Electron iniciará o aplicativo de console em segundo plano que exporá um serviço no localhost: xxxx.

Desta forma, você pode implementar toda a lógica de back-end usando .Net para ser acessível por meio de solicitações HTTP de JavaScript.

Dê uma olhada neste post, ele explica como construir um aplicativo desktop multiplataforma com Electron e .Net Core e verificar o código no github

Rui Figueiredo
fonte
17

Para a criação de UI baseado em console, você pode usar gui.cs . É open-source (de Miguel, criador do Xamarin), e roda em .Net core em Windows, Linux e MacOs.

Possui os seguintes componentes:

  • Botões
  • Etiquetas
  • Entrada de texto
  • Visualização de texto
  • Campo de edição de tempo
  • Botões do rádio
  • Caixas de seleção
  • Caixa de diálogo
    • Caixas de mensagem
  • janelas
  • Menus
  • ListViews
  • Molduras
  • ProgressBars
  • Visualizações de rolagem e barras de rolagem
  • Visualizador / editor hexadecimal (HexView)

Captura de tela de amostra

captura de tela de amostra de saída gui.cs

Kolappan N
fonte
16

codificamos uma solução de código aberto para elétron com núcleo .net: Electron.NET . https://github.com/ElectronNET/Electron.NET

Aproveitar!

Gregor Biswanger
fonte
15
O que diabos. Se eu quiser uma página HTML, farei uma página HTML. Quero algo que interaja melhor com a área de trabalho do que isso.
Joshua
4

tl; dr - Não tenho certeza se seria possível para os desenvolvedores do .NET Core fornecer uma estrutura de interface de usuário de plataforma cruzada.

Eu sinto que esperar que uma estrutura de interface de usuário de plataforma cruzada seja agrupada no conjunto de ferramentas oficial (especialmente uma versão antiga do conjunto de ferramentas - você mencionou que está executando a atualização 3 do VS 2015) para uma versão inicial do .NET Core é um pouco prematuro.

Frameworks de GUI são realmente muito pesados ​​e dependem das abstrações de hardware já presentes na máquina host. No Windows, geralmente há um único gerenciador de janelas (WM) e ambiente de área de trabalho (DE) usado pela maioria dos usuários, mas nas muitas distribuições diferentes do Linux que são suportadas, há qualquer número de WMs e DEs possíveis - garantido que a maioria dos usuários também estar usando o X-Server ou Wayland em combinação com KDE, Gnome ou XFCE. Mas nenhuma instalação do Linux é igual.

O fato de que a comunidade de código aberto não pode realmente estabelecer uma configuração "padrão" para uma VM e DE significa que seria muito difícil para os desenvolvedores do .NET Core criar uma estrutura de GUI que funcionasse em todas as plataformas e combinações de DEs e WMs.

Muitas pessoas aqui têm ótimas sugestões (desde usar o ASP.NET Core para construir um aplicativo da Web e usar um navegador até listar várias estruturas de plataforma cruzada). Se você der uma olhada em alguns dos frameworks GUI multiplataforma mencionados listados, verá como eles são pesados.

No entanto, há luz no fim do túnel quando Miguel de Icaza mostrou o Xamarin rodando ingenuamente no Linux e MacOS no .NET Conf este ano (2017, se você estiver lendo isso no futuro), então pode valer a pena tentar isso quando estiver pronto.

(mas você precisará atualizar do VS 2015 para o VS 2017 para acessar os recursos do .NET Core 2.0)

Jamie Taylor
fonte
nenhum raciocínio para a variedade do Linux. 1. Java roda sem problemas 2. Mono roda WinForms normalmente (muito feio) No linux você pode usar GTK em uma distribuição baseada em QT e vice-versa. Seria legal ter ligações QT para o núcleo .net.
Bogdan Mart
Eu concordo com tudo o que você diz. No entanto, acho que a abordagem da Microsoft é fornecer IaaS (infraestrutura como serviço), SaaS (software como serviço) e PaaS (plataforma como serviço) por meio de sua plataforma Azure no momento. Faria sentido que sua estrutura de plataforma cruzada de código aberto original apontasse os desenvolvedores nessa direção como uma prioridade. O trabalho que o Azure e outras empresas como RHEL e Google estão fazendo para oferecer suporte ao ASP NET Core e ao .NET Core é praticamente lendário, e faz sentido que a prioridade do .NET Core pareça refletir isso.
Jamie Taylor
4

Estou trabalhando em um projeto que pode ajudar: https://github.com/gkmo/CarloSharp

O aplicativo a seguir foi escrito em .net com a IU em HTML / JS / CSS (angular)

insira a descrição da imagem aqui

guilhermekmelo
fonte
1
Sem HTML, por favor.
Richard Lalancette
3

Você pode desenvolver um aplicativo da web com .NET Core e MVC e encapsulá-lo em um aplicativo JavaScript universal do Windows: https://docs.microsoft.com/en-us/windows/uwp/porting/hwa-create-windows

Ainda é um aplicativo da web, mas é uma maneira muito leve de transformar um aplicativo da web em um aplicativo de desktop sem aprender uma nova estrutura ou / e desenvolver novamente a IU, e funciona muito bem.

O inconveniente é diferente do elétron ou ReactXP, por exemplo, o resultado é um aplicativo universal do Windows e não um aplicativo de plataforma cruzada para desktop.

AdrienTorris
fonte
2

Sim, é possível.

O .NET Core não possui nenhum componente para o aplicativo GUI nativo pronto para uso. No entanto, existe um pacote NuGet para ele que é chamado Electron.NET , de acordo com a resposta de Gregor Biswanger.

Electron é uma estrutura que permite construir aplicativos de GUI nativos com base no Node.js. Electron.NET é um pacote NuGet que permite utilizar Electron e Node.js de dentro de seu código .NET Core.

A boa notícia é que você não precisa aprender JavaScript, Electron ou Node.js para poder usar o pacote NuGet. Os arquivos JS são executados dentro do seu aplicativo, mas são gerados automaticamente pelo processo de construção.

Tudo o que você faz é construir um aplicativo ASP.NET Core MVC bastante padrão. A única diferença é que, em vez de ser executado no navegador, ele é executado como um aplicativo de janela nativo. Além de apenas algumas linhas de código específicas para o pacote Electron.NET, você não precisará aprender nada acima do ASP.NET Core MVC.

Esta página fornece um tutorial sobre como usá-lo. Ele também contém alguns links para exemplos de repositórios de código.

Fiodar Sazanavets
fonte
2

Necromante.
Para o caso especial de aplicativos WinForms existentes :

Existe uma maneira - embora eu não saiba se funciona bem.
É assim:
Obtenha a implementação WinForms do mono.
Transfira-o para .NET Core ou NetStandard.

Recompile seus aplicativos WinForms contra o novo System.Windows.Forms.
Conserte qualquer coisa que possa estar danificada pelo NetCore.
Ore para que o mono implemente as peças de que você precisa perfeitamente.
(se não, você pode sempre parar de orar e enviar ao mono-projeto uma solicitação de pull com sua correção / patch / recurso)

Este é meu repositório CoreFX WinForms:
https://github.com/ststeiger/System.CoreFX.Forms

Stefan Steiger
fonte
2

É uma questão antiga, mas sim, é possível desenvolver aplicativos de desktop multiplataforma (GUI), para Windows, Linux e macOS, usando VSCode, .Net Core, C #, gtk3, gtksharp e Glade como GUI Designer.

Aqui está como .

Teo Bebekis
fonte
0

Se você estiver usando o .Net Core 3.0e acima, siga as etapas a seguir e você está pronto para prosseguir: (vou usar o .NET Core CLI , mas você também pode usar o Visual Studio)

  1. md MyWinFormsApp passo opcional
  2. cd MyWinFormsApp passo opcional
  3. dotnet new sln -n MyWinFormsApp etapa opcional, mas é uma boa ideia
  4. dotnet new winforms -n MyWinFormsApp Me desculpe, isso não é opcional
  5. dotnet sln add MyWinFormsApp faça isso se você seguiu a etapa 3

Ok, você pode parar de ler minha resposta e começar a adicionar código ao MyWinFormsAppprojeto. mas se você quiser trabalhar com o Form Designer, continue lendo.

  1. Abra o MyWinFormsApp.csprojarquivo e mude <TargetFramework>netcoreapp3.1<TargetFramework>para <TargetFrameworks>net472;netcoreapp3.1</TargetFrameworks>(se estiver usando netcoreapp3.0, não se preocupe, mude para <TargetFrameworks>net472;netcoreapp3.0</TargetFrameworks>)
  2. Em seguida, adicione o seguinte ItemGroup
  <ItemGroup Condition="'$(TargetFramework)' == 'net472'">
    <Compile Update="Form1.cs">
      <SubType>Form</SubType>
    </Compile>
    <Compile Update="Form1.Designer.cs">
      <DependentUpon>Form1.cs</DependentUpon>
    </Compile>
  </ItemGroup>

Depois de seguir essas etapas, você deverá obter o seguinte:

<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.cse adicione o seguinte pré-processador - se
#if NETCOREAPP3_1
    Application.SetHighDpiMode(HighDpiMode.SystemAware);
#endif

Agora você pode abrir o MyWinFormsAppprojeto usando o Visual Studio 2019 ( acho que você pode usar o Visual Studio 2017 também, mas não tenho certeza ) e clicar duas vezes em Form1.cse você verá isto:

insira a descrição da imagem aqui

Ok, abra a caixa de ferramentas (Ctrl+W,X ) e comece a adicionar controles ao seu aplicativo e torná-lo bonito.

Você pode ler mais sobre designer @ Windows Forms .NET Core Designer

Mehdi Dehghani
fonte