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ć?