Visual Studio 2022에 Avalonia 확장을 설치하고 Avalonia C# Project를 생성했습니다.
추가 코딩을 아무것도 하지 않고 기본으로 생성된 프로젝트를 win-x64로 publish하여 windows에서 실행하면 정상적으로 실행이됩니다.
그러나 linux-x64로 publish하여 Linux에서 실행하니 다음과 같은 오류가 발생합니다.
jd@raspberry:~/Desktop/av $ ./AvaloniaApplication1.Desktop
Unhandled exception. System.TypeInitializationException: The type initializer for 'SkiaSharp.SKImageInfo' threw an exception.
---> System.DllNotFoundException: Unable to load shared library 'libSkiaSharp' or one of its dependencies. In order to help diagnose loading problems, consider using a tool like strace. If you're using glibc, consider setting the LD_DEBUG environment variable:
libfontconfig.so.1: cannot open shared object file: No such file or directory
libSkiaSharp.so: cannot open shared object file: No such file or directory
/home/jd/Desktop/av/liblibSkiaSharp.so: cannot open shared object file: No such file or directory
/home/jd/Desktop/av/libSkiaSharp: cannot open shared object file: No such file or directory
/home/jd/Desktop/av/liblibSkiaSharp: cannot open shared object file: No such file or directory
at SkiaSharp.SkiaApi.sk_colortype_get_default_8888()
at SkiaSharp.SKImageInfo..cctor()
--- End of inner exception stack trace ---
at Avalonia.Skia.PlatformRenderInterface..ctor(Nullable`1 maxResourceBytes) in /_/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs:line 25
at Avalonia.Skia.SkiaPlatform.Initialize(SkiaOptions options) in /_/src/Skia/Avalonia.Skia/SkiaPlatform.cs:line 20
at Avalonia.SkiaApplicationExtensions.<>c.<UseSkia>b__0_0() in /_/src/Skia/Avalonia.Skia/SkiaApplicationExtensions.cs:line 19
at Avalonia.AppBuilder.SetupUnsafe() in /_/src/Avalonia.Controls/AppBuilder.cs:line 314
at Avalonia.AppBuilder.Setup() in /_/src/Avalonia.Controls/AppBuilder.cs:line 303
at Avalonia.AppBuilder.SetupWithLifetime(IApplicationLifetime lifetime) in /_/src/Avalonia.Controls/AppBuilder.cs:line 187
at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime(AppBuilder builder, String[] args, ShutdownMode shutdownMode) in /_/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs:line 219
at AvaloniaApplication1.Desktop.Program.Main(String[] args) in D:\03.Test\AvaloniaUITest\ForQnA\AvaloniaApplication1.Desktop\Program.cs:line 13
Stopped
Linux에서 C#으로 UI작업이 필요해서 AvaloniaUI를 사용해보려고 하는데 시작부터 안되니 조금 황당합니다.
어떻게 해결해야 하는지 또는 제가 무엇을 잘못했는지 도움 부탁드립니다.
참고로 아래는 저의 Linux 환경입니다.
일반적인 경우 위와 같이 Publish를 통해 배포를 하면 Target rumtime에 대한 Dependency가 있는 라이브러리가 함께 포함됩니다.
그런데 로그에서 SkiaSharp관련 라이브러리가 배포되지 않은 것으로 나타납니다.
Target runtime이 linux-arm64인지 한번 확인해 보세요.
우선 의존성 관련 패키지를 모두 설치했습니다.
패키지를 amd64로 설치하니까 의존성 오류가 해결되더군요.
그런데 다른 오류가 발생했습니다.
jd@raspberry:~/Desktop $ ./AvaloniaApplication1.Desktop
Unhandled exception. System.InvalidOperationException: Default font family name can't be null or empty.
at Avalonia.Media.FontManager..ctor(IFontManagerImpl platformImpl) in /_/src/Avalonia.Base/Media/FontManager.cs:line 37
at Avalonia.Media.FontManager.get_Current() in /_/src/Avalonia.Base/Media/FontManager.cs:line 59
at Avalonia.AppBuilder.<>c__DisplayClass62_0.<ConfigureFonts>b__0(AppBuilder appBuilder) in /_/src/Avalonia.Controls/AppBuilder.cs:line 269
at Avalonia.AppBuilder.SetupUnsafe() in /_/src/Avalonia.Controls/AppBuilder.cs:line 322
at Avalonia.AppBuilder.Setup() in /_/src/Avalonia.Controls/AppBuilder.cs:line 303
at Avalonia.AppBuilder.SetupWithLifetime(IApplicationLifetime lifetime) in /_/src/Avalonia.Controls/AppBuilder.cs:line 187
at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime(AppBuilder builder, String[] args, ShutdownMode shutdownMode) in /_/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs:line 219
at AvaloniaApplication1.Desktop.Program.Main(String[] args) in D:\AvaloniaApplication1\AvaloniaApplication1.Desktop\Program.cs:line 13
Stopped
Default Font가 설치되어 있지 않아서 오류가 발생하는 것 같은데…
Avalonia UI에서는 어느 Font를 Default로 사용하나요?
어떤 Font를 설치해야 오류가 해결될까요?
그리고, Default Font가 설치되어 있지 않으면 다른 대체 Font로 사용하도록 하려면 프로그램의 어느부분을 수정해야 하는지요?
var options = new FontManagerOptions();
if (Environment.OSVersion.Platform== PlatformID.Unix)
{
options.DefaultFamilyName = "NamumGothic";
}
return AppBuilder.Configure<App>().UsePlatformDetect().With(options);
저는 영문 로캘 리눅스에서만 사용해왔어서 해당 문제가 발생하지 않았는데요, 위와 같이 Main() 함수의 AppBuilder 부분에 With()함수를 이용해 FontManagerOptions.DefaultFamilyName 속성을 지정해주니 한글 로캘에서도 정상 동작하는 것 같습니다.