Czy jest możliwe stworzenie aplikacji graficznej na komputery stacjonarne w .NET core?


110

Od kilku lat rozwijam programy WinForms. Patrzę teraz na .NET Core (w tym ASP.NET Core MVC). Szukam nowej technologii graficznej GUI. W programie Visual Studio 2015, aktualizacja 3 nie widzę żadnej opcji tworzenia aplikacji z interfejsem graficznym w .NET Core. czego mi brakuje?


Powinieneś zmienić kąt widzenia tej nowej platformy. Wszystkie istniejące platformy, WPF / WinForms / UWP / GTK # / Xamarin.Mac / iOS / Android mogą używać kodu, który piszesz w .NET Core. To umożliwia rozwój międzyplatformowy, ale nie w sposób, jaki sobie wyobrażasz.
Lex Li

Więc mówisz, że mogę zbudować GUI w - na przykład - winforms i kod zaplecza w .net core
EKanadily

Nie. Pakiety oparte na platformie .NET Core można dodawać bezpośrednio jako odwołania.
Lex Li

1
Electron to droga do zrobienia. Użyj asp.net za interfejsem API. Jeśli zachowasz światło logiki interfejsu użytkownika, powinieneś być w stanie zachować najważniejszą część aplikacji na .net
user7558114

1
Jako profesjonalna wskazówka, zaktualizowałbym do Visual Studio 2017 (jeśli to możliwe) lub użył innych dostępnych narzędzi (CLI i / lub VS Code / Rider), ponieważ VS 2015 nie ma dostępu do narzędzi .NET Core 2.0, które będą utrudniać rozwój. Nawet jeśli wszystko, co robisz, to eksperymentowanie z tym.
Jamie Taylor

Odpowiedzi:


73

Niczego nie brakowało. Firma MS nie dostarczyła żadnego rozsądnego sposobu na tworzenie aplikacji GUI bezpośrednio przy użyciu .Net Core do .Net Core 3, chociaż UWP (Universal Windows Platform) jest częściowo zbudowany na .Net Core.

.Net Core 3.0 obejmuje obsługę Winforms i WPF, chociaż jest dostępna tylko dla systemu Windows.

.Net 6 będzie zawierał .Net MAUI, który będzie obsługiwał aplikacje desktopowe dla systemów Windows i macOS oraz aplikacje mobilne, z aplikacjami komputerowymi Linux obsługiwanymi przez społeczność (nie MS). .Net 5 będzie zawierać podglądową wersję .Net MAUI.

Aby zapoznać się z opcjami dla różnych platform, zobacz inne odpowiedzi.


45
omg, to jest szok! więc jaki jest sens struktury wieloplatformowej, która nie ma GUI?
EKanadily

21
@EssamGndelee Głównym punktem są aplikacje ASP.NET Core. Dodatkowym punktem są aplikacje konsolowe.
svick

3
@ChristopherPainter Lepsze wsparcie dla przetwarzania w chmurze i przyciąganie programistów z platform takich jak Node.js to tylko niektóre z powodów, dla których .Net Core istnieje, tak. Ale to nie znaczy, że Microsoftowi zależy teraz tylko na nich.
svick

1
@CYoung Myślę, że stanowisko Microsoftu jest takie, że powinieneś używać do tego UWP.
svick

1
@svick, to całkowicie wyeliminowałoby programowanie międzyplatformowe, które miał rozwiązać .NET Core. UWP jest wystarczająco dobry tylko dla rodziny MS: /
walther

50

AvaloniaUI obsługuje teraz działanie na platformie .NET Core w systemach Win / OSX / Linux. Zawiera XAML, powiązania i szablony formantów.

np. aby rozwijać się na MacOs z Rider:

  1. Postępuj zgodnie z instrukcjami, aby zainstalować nowe szablony Avalonia dotnet
  2. Otwórz JetBrains Rider i z ekranu powitalnego,
  3. Wybierz New Solution-> (U góry listy szablonów) -> More Templates-> Przycisk Install Template...-> przejdź do katalogu, w którym sklonowałeś szablony w kroku 1.
  4. Kliknij Reloadprzycisk
  5. Ujrzeć! Szablony Avalonia pojawiają się teraz na liście New Solutionszablonów!
  6. Wybierz szablon Avalonia
  7. Buduj i uruchamiaj. Zobacz, jak GUI otwiera się na twoich oczach.

GUI kroki, aby zainstalować nowy szablon dotnet w JetBrains Rider


Na marginesie, wszyscy zainteresowani zagłosuj na Jetbrains w celu włączenia obsługi Avalonia do Rider: youtrack.jetbrains.com/issue/RIDER-39247
xendi

40

Możesz użyć Electron i połączyć go z Edge.js odp. krawędź elektronu . Edge.js umożliwia elektronowi (node.js) wywoływanie bibliotek .net dll i odwrotnie. W ten sposób możesz napisać GUI z HTML, CSS i JavaScript, a backend z .net core. Sam Electron jest również wieloplatformowy i oparty na przeglądarce chromu.


7
Ale dlaczego elektron? Możesz także po prostu otworzyć aplikację internetową na porcie X, a następnie przejść tam w przeglądarce. Obejmuje wszystko, co może Electron, a także więcej, ponieważ jest to zawsze najnowsza wersja przeglądarki - w przeciwieństwie do Electron. Jeśli potrzebujesz określonej wersji przeglądarki, dołącz Google-Chrome do swojej dystrybucji.
Stefan Steiger

1
@StefanSteiger Myślę, że użycie electron, a także wywołanie API bezpośrednio przez assembler wypełni lukę, że użytkownik nie będzie widział aplikacji jako aplikacji internetowej. Niektórzy programiści nie chcą dodawać więcej warstwy komunikacyjnej za pomocą protokołu HTTP.
Brian Ng

Wygląda na to, że Electron.Net jest teraz całkiem prosty cross-platform-blog.com/electron.net/…
J. Allen

Electron.NET wygląda obiecująco, ale byłbym zmęczony używaniem go w środowisku produkcyjnym, ponieważ zmusza Cię do otwarcia niezabezpieczonego serwera WWW na maszynie produkcyjnej. Z drugiej strony, o ile koniec aplikacji ASP.NET Core znajduje się za odpowiednio skonfigurowanym odwrotnym serwerem proxy, takim jak IIS lub nginx (lub podobny), powinieneś być bezpieczniejszy.
Jamie Taylor

piekło może po prostu aplikacja jako mvc / webapi, hostować lokalnie na losowym porcie i używać interfejsu electron wywołującego lokalne API.
Wjdavis5

31

Obecnie można używać Qt / QtQuick / QML z .NET Core, używając Qml.Net .

Jest bardzo wydajny (nie "pinvoke chatty"), w pełni funkcjonalny i działa w systemach Linux / OSX / Windows.

Sprawdź mój post na blogu, aby zobaczyć, jak wypada on w porównaniu z innymi dostępnymi obecnie opcjami.

PS: Jestem autorem.


Wygląda bardzo obiecująco, przyjrzę się temu
Daniel

21

Jedną z opcji byłoby użycie Electron z JavaScript, HTML i CSS dla interfejsu użytkownika i zbudowanie aplikacji konsoli .Net Core, która będzie samodzielnie hostować interfejs API sieci Web dla logiki zaplecza. Electron uruchomi w tle aplikację konsolową, która ujawni usługę na localhost: xxxx.

W ten sposób można zaimplementować całą logikę zaplecza za pomocą .Net, aby była dostępna przez żądania HTTP z JavaScript.

Spójrz na ten post, wyjaśnia, jak zbudować wieloplatformową aplikację komputerową z Electron i .Net Core i sprawdzić kod na github


20

Do tworzenia interfejsu użytkownika opartego na konsoli, można użyć gui.cs . Jest open source (autorstwa Miguela, twórcy platformy Xamarin) i działa na platformie .Net Core w systemach Windows, Linux i MacOs.

Składa się z następujących elementów:

  • guziki
  • Etykiety
  • Wpis tekstowy
  • Widok tekstu
  • Pole edycji czasu
  • Przyciski radiowe
  • Pola wyboru
  • Okna dialogowe
    • Skrzynki wiadomości
  • Windows
  • Menu
  • ListViews
  • Ramy
  • ProgressBars
  • Przewijaj widoki i paski przewijania
  • Przeglądarka / edytor szesnastkowy (HexView)

Przykładowy zrzut ekranu

Przykładowy zrzut ekranu wyjściowego gui.cs




4

tl; dr - Nie jestem pewien, czy deweloperzy .NET Core mogliby dostarczyć międzyplatformowy framework GUI.

Mam ochotę oczekiwać, że wieloplatformowy framework GUI zostanie dołączony do oficjalnych narzędzi (zwłaszcza stara wersja narzędzi - wspomniałeś, że używasz VS 2015 Update 3) dla wczesnej wersji .NET Core jest trochę przedwczesna.

Struktury GUI są naprawdę dość ciężkie i zależą od abstrakcji sprzętowych już obecnych na maszynie hosta. W systemie Windows jest generalnie jeden menedżer okien (WM) i środowisko graficzne (DE) używane przez większość użytkowników, ale w wielu różnych dystrybucjach Linuksa, które są obsługiwane, istnieje dowolna liczba możliwych WM i DE - przy czym większość użytkowników będzie albo używać X-Server lub Wayland w połączeniu z KDE, Gnome lub XFCE. Ale żadna instalacja Linuksa nie jest taka sama.

Fakt, że społeczność open source nie może tak naprawdę zdecydować się na „standardową” konfigurację maszyny wirtualnej i DE oznacza, że ​​twórcom .NET Core byłoby dość trudno stworzyć strukturę GUI, która działałaby na wszystkich platformach i kombinacjach DE i WM.

Wielu ludzi tutaj ma kilka świetnych sugestii (od używania ASP.NET Core do tworzenia aplikacji sieci Web i używania przeglądarki do wyświetlania listy wielu platform międzyplatformowych). Jeśli spojrzysz na niektóre z wymienionych powyżej platform GUI, zobaczysz, jakie są ciężkie.

Jednak na końcu tunelu jest światło, ponieważ Miguel de Icaza popisał się naiwnie działającym Xamarinem na Linuksie i MacOS na .NET Conf w tym roku (2017, jeśli czytasz to w przyszłości), więc może warto spróbować że kiedy będzie gotowe.

(ale aby uzyskać dostęp do funkcji .NET Core 2.0, musisz zaktualizować wersję VS 2015 do VS 2017)


brak uzasadnienia dla różnorodności Linuksa. 1. Java działa płynnie 2. Mono uruchamia WinForms normalnie (co brzydkie) W linuksie możesz używać GTK na dystrybucji opartej na QT i odwrotnie. Fajnie byłoby mieć wiązania QT dla .net core.
Bogdan Mart

Zgadzam się ze wszystkim, co mówisz. Uważam jednak, że podejście firmy Microsoft polega obecnie na dostarczaniu IaaS (infrastruktura jako usługa), SaaS (oprogramowanie jako usługa) i PaaS (platforma jako usługa) za pośrednictwem platformy Azure. Miałoby sens, gdyby ich pierwszy, otwarty, wieloplatformowy framework wskazywał programistom ten kierunek jako priorytet. Praca, którą Azure i inne firmy, takie jak RHEL i Google, wykonują w celu obsługi zarówno ASP NET Core, jak i .NET Core, jest praktycznie legendarna i ma sens, że priorytet dla .NET Core wydaje się to odzwierciedlać.
Jamie Taylor


3

Możesz stworzyć aplikację internetową z .NET Core i MVC i zamknąć ją w uniwersalnej aplikacji JavaScript systemu Windows: https://docs.microsoft.com/en-us/windows/uwp/porting/hwa-create-windows

Wciąż jest to aplikacja internetowa, ale jest to bardzo lekki sposób na przekształcenie aplikacji internetowej w aplikację komputerową bez uczenia się nowego frameworka lub / i przeprojektowywania interfejsu użytkownika i działa świetnie.

Niedogodność jest inna niż na przykład electron czy ReactXP , w rezultacie powstała uniwersalna aplikacja Windows, a nie wieloplatformowa aplikacja komputerowa.


3

Tak to mozliwe.

NET Core nie ma żadnych składników dla natywnej aplikacji GUI po wyjęciu z pudełka. Istnieje jednak pakiet NuGet o nazwie Electron.NET , zgodnie z odpowiedzią Gregora Biswangera.

Elektron to framework, który umożliwia tworzenie natywnych aplikacji GUI w oparciu o Node.js. Electron.NET to pakiet NuGet, który umożliwia korzystanie z Electron i Node.js z poziomu kodu .NET Core.

Dobra wiadomość jest taka, że ​​nie musisz uczyć się JavaScript, Electron ani Node.js, aby móc korzystać z pakietu NuGet. Pliki JS działają w aplikacji, ale są automatycznie generowane podczas procesu kompilacji.

Wszystko, co musisz zrobić, to zbudować całkiem standardową aplikację ASP.NET Core MVC. Jedyną różnicą jest to, że zamiast działać w przeglądarce, działa jako natywna aplikacja okienna. Poza kilkoma wierszami kodu specyficznego dla pakietu Electron.NET, nie musisz uczyć się niczego powyżej ASP.NET Core MVC.

Ta strona zawiera samouczek, jak z niego korzystać. Zawiera również linki do przykładowych repozytoriów kodu.


2

Nekromancja.
Dla szczególnego przypadku istniejących aplikacji WinForms :

Jest sposób - chociaż nie wiem, jak dobrze działa.
Działa to tak:
weź implementację WinForms z mono.
Przenieś go na .NET Core lub NetStandard.

Ponownie skompiluj aplikacje WinForms do nowego System.Windows.Forms.
Napraw wszystko, co może zostać uszkodzone przez NetCore.
Módlcie się, aby mono bezbłędnie realizowało potrzebne części.
(jeśli tak się nie stanie, zawsze możesz przestać się modlić i wysłać mono-projektowi żądanie ściągnięcia z poprawką / poprawką / funkcją)

Oto moje repozytorium CoreFX WinForms:
https://github.com/ststeiger/System.CoreFX.Forms


2

To stare pytanie, ale tak, możliwe jest tworzenie wieloplatformowych aplikacji desktopowych (GUI) dla systemów Windows, Linux i macOS, używając VSCode, .Net Core, C #, gtk3, gtksharp i Glade jako projektanta GUI.

Oto jak .


0

Jeśli używasz .Net Core 3.0i powyżej, wykonaj następujące kroki i możesz już iść: (mam zamiar używać .NET Core CLI , ale możesz też użyć Visual Studio)

  1. md MyWinFormsApp krok opcjonalny
  2. cd MyWinFormsApp krok opcjonalny
  3. dotnet new sln -n MyWinFormsApp krok opcjonalny, ale to dobry pomysł
  4. dotnet new winforms -n MyWinFormsApp Przepraszam, to nie jest opcjonalne
  5. dotnet sln add MyWinFormsApp zrób to, jeśli wykonałeś krok 3

OK, możesz przestać czytać moją odpowiedź i zacząć dodawać kod do MyWinFormsAppprojektu. ale jeśli chcesz pracować z Projektantem formularzy, czytaj dalej.

  1. Otwórz MyWinFormsApp.csprojplik i zmień go <TargetFramework>netcoreapp3.1<TargetFramework>na <TargetFrameworks>net472;netcoreapp3.1</TargetFrameworks>(jeśli używasz netcoreapp3.0, nie martw się, zmień go na<TargetFrameworks>net472;netcoreapp3.0</TargetFrameworks> )
  2. Następnie dodaj następujące ItemGroup
  <ItemGroup Condition="'$(TargetFramework)' == 'net472'">
    <Compile Update="Form1.cs">
      <SubType>Form</SubType>
    </Compile>
    <Compile Update="Form1.Designer.cs">
      <DependentUpon>Form1.cs</DependentUpon>
    </Compile>
  </ItemGroup>

Po wykonaniu tych kroków powinieneś otrzymać:

<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. Otwórz Program.csi dodaj następujący preprocesor-if
#if NETCOREAPP3_1
    Application.SetHighDpiMode(HighDpiMode.SystemAware);
#endif

Teraz możesz otworzyć MyWinFormsAppprojekt za pomocą Visual Studio 2019 ( myślę, że możesz też użyć Visual Studio 2017, ale nie jestem pewien ) i dwukrotnie kliknąć Form1.csi powinieneś zobaczyć to:

wprowadź opis obrazu tutaj

OK, otwórz Toolbox (Ctrl+W,X ) i zacznij dodawać elementy sterujące do swojej aplikacji i spraw, by była ładna.

Możesz przeczytać więcej o Designer @ Windows Forms .NET Core Designer


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.