Aplikacja graficzna na wielu systemach operacyjnych

0

Teoretycznie, w NET Core można tworzyć aplikację wykorzystujące System.Drawing.Common, ale działają one tylko na Windows, przy próbie uruchomienia na innym systemie pojawia się wyjątek.

Mam Ubuntu 20.04, VSC z OmniSharp, zainstalowałem Avalonia i utworzyłem projekt typu avalonia.mvvm.

Plik Program.cs zmodyfikowałem tak, jak poniżej:

using Avalonia;
using Avalonia.ReactiveUI;
using System;

namespace Proj1;

class Program
{

    public static void Main(string[] args)
    {
        System.Drawing.Bitmap BitmpS_;
        System.Drawing.Graphics BitmapG_;

        BitmpS_ = new System.Drawing.Bitmap(640, 480, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
        BitmapG_ = System.Drawing.Graphics.FromImage(BitmpS_);

        BitmapG_.FillRectangle(new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(255, 0, 0)), 0, 0, 320, 240);
        BitmapG_.FillRectangle(new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(255, 255, 0)), 320, 0, 320, 240);
        BitmapG_.FillRectangle(new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(0, 255, 0)), 0, 240, 320, 240);
        BitmapG_.FillRectangle(new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(0, 0, 255)), 320, 240, 320, 240);

        BitmpS_.Save("Test.png");
    }

    /*
    // Initialization code. Don't use any Avalonia, third-party APIs or any
    // SynchronizationContext-reliant code before AppMain is called: things aren't initialized
    // yet and stuff might break.
    [STAThread]
    public static void Main(string[] args) => BuildAvaloniaApp()
        .StartWithClassicDesktopLifetime(args);

    // Avalonia configuration, don't remove; also used by visual designer.
    public static AppBuilder BuildAvaloniaApp()
        => AppBuilder.Configure<App>()
            .UsePlatformDetect()
            .LogToTrace()
            .UseReactiveUI();
            */
}

Jak widać, program jest bardzo prosty. Tworzy nową bitmapę, maluje 4 prostokąty i zapisuje na dysku. Program na Linux działa poprawnie.

Teraz, zrobiłem nowy projekt typu console, wygenerował się plik Proj2.csproj o takiej zawartości:

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

Gdzieś wyczytałem, że żeby podłączyć plik DLL jako referencję, to trzeba wyedytować plik *.csproj. Dokonałem takiej modyfikacjI (skróciłem ścieżkę dla czytelności):

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="/.../VSC/Proj1/bin/Debug/net6.0/System.Drawing.Common.dll" />
  </ItemGroup>
</Project>

Do pliku Program.cs wkleiłem kod tworzący bitmapę. W tym przypadku program wysypał się z komunikatem CLR/System.PlatformNotSupportedException.

Potem zmieniłem plik na /.../VSC/Proj1/bin/Debug/net6.0/runtimes/unix/lib/netcoreapp2.0/System.Drawing.Common.dll i program uruchomił się. Wygląda na to, że wbrew pozorom, pod Linux da się uzyskać funkcjonalność biblioteki System.Drawing.

W jaki sposób za pomocą VSC lub dotnet można prawidłowo podłączyć Avalonia lub plik System.Drawing.Common w wersji działającej tak, żeby nie trzeba było podmieniać pliku przy przenoszeniu między systemami? Zauważyłem, ze program w Avalonia działa po przeniesieniu całego folderu w Windows.

Docelowo chciałbym móc utworzyć aplikację w konsoli, tworząca lub odczytującą jakąś bitmapę, wykonującą jakieś czynności na niej, ale bez GUI. Jak to poprawnie zrobić?

0

Nie mogłem znaleźć sam, więc zapytam, jakie jest polecenie dla dotnet lub jaka funkcja w VSC, która wyświetla listę zainstalowanych pakietów w systemie i umożliwia podłączenie do referencji jednego z nich? Na przykład na takiej liście byłyby pakiety System.NET, System.Windows.Forms, System.Drawing, System.Web itp. Skoro można zrobić nowy projekt w oparciu o Avalonia, to może wystarczy w taki sposób podłączyć pakiet Avalonia do projektu konsolowego, tylko nie wiem, jak dokładnie się nazywa i jak podłączyć systemowy pakiet.

1 użytkowników online, w tym zalogowanych: 0, gości: 1