Deployment von LLCP unter Linux

So, ich habe nun alle meine Berichte erfolgreich umstellen können und unter Windows testen können.
Jetzt habe ich, voller Vorfreude, meinen Azure Container App(.Net 10) aktualisiert und versucht einen Bericht zu drucken. Aber leider habe sehr viele Fehlermeldungen bekommen, das einige Abhängigkeiten fehlen.

System.DllNotFoundException: Unable to load shared library ‘libSkiaSharp’
/app/libSkiaSharp.so: cannot open shared object file: No such file or directory
/usr/share/dotnet/shared/Microsoft.NETCore.App/10.0.1/libSkiaSharp.so: cannot open shared object file: No such file or directory

Dann dachte ich mir, okay dann füge ich diese über die Dockerfile hinzu und dann gehts los, aber leider wurde ich dann wieder enttäuscht. Nach etwas chatten mit AI wurde mir diese Antwort präsentiert:

Jetzt stellt sich für mich die Frage, wie kann ich List&Label CrossPlatform in Azure Container Apps(Linux) und .Net 10 Berichte erstellen?

Auf der Webseite ist auch “Azure-Container” aufgeführt und auch das .NET 10 funktionieren wird.

Viele Grüße und vielen Dank
Holger

Ich bin mir nicht sicher, ob die KI da richtig liegt. Nach unseren Tests funktioniert das. Die Meldung klingt eher so, als würde das Package mit den nativen Dependencies für SkiaSharp fehlen. Das ist hier dokumentiert:

Konkret geht es um dieses Package:

Die Docker-Konfiguration ist hier dokumentiert:

Schau mal, ob das bei dir auch so klappt und melde dich sonst gerne nochmal. Ich splitte das hier in ein eigenes Thema, könnte ja auch für andere interessant werden.

Hallo Jochen,

so.., ich bin leider erst wieder heute zu dem Thema gekommen. Ich habe ein paar Scripte und meine Dockerfile erstellt und soweit funktioniert alles. Ich habe die WebAPI in Azure am laufen, der Export von CSV-Dateien klappt wunderbar, aber leider bekomme ich beim Erstellen von PDF-Dateien die folgende Fehlermeldung.

2026-01-09T19:34:44.6159852Z stdout F       SkiaPdfDocumentRenderer.SetMetadata(DocumentMetadata[Author = 'null', Title = 'null', Subject = 'null', Keywords = 'null', Creator = 'null', Producer = 'combit® List & Label® Cross Platform (31.0.0.0)', Creation = 01/09/2026 19:34:44, Modified = 01/09/2026 19:34:44]) -> void
2026-01-09T19:34:44.6491215Z stdout F fail: ListLabel[0]
2026-01-09T19:34:44.6491705Z stdout F       SkiaPdfDocumentRenderer.BeginDocument(System.IO.FileStream) threw an exception.
2026-01-09T19:34:44.6491898Z stdout F       System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
2026-01-09T19:34:44.6491934Z stdout F        ---> System.TypeInitializationException: The type initializer for 'SkiaSharp.SKObject' threw an exception.
2026-01-09T19:34:44.6491955Z stdout F        ---> System.InvalidOperationException: **The version of the native libSkiaSharp library (88.1) is incompatible with this version of SkiaSharp. Supported versions of the native libSkiaSharp library are in the range [119.0, 120.0).**
2026-01-09T19:34:44.6492000Z stdout F          at SkiaSharp.SkiaSharpVersion.CheckNativeLibraryCompatible(Version minSupported, Version current, Boolean throwIfIncompatible)

Ich habe diese Zeilen in meiner Dockerfile hinzugefügt, so wie es in den Docs beschrieben ist.
Ich hoffe du kannst mir nochmals weiterhelfen?

**USER root**

**# Install native dependencies required by List & Label Cross Platform**
**RUN apt-get update && apt-get install -y \**
**    libc6 \**
**    libfontconfig1 \**
**    libfreetype6 \**
**    libpng16-16 \**
**    libjpeg62 \**
**    libgif7 \**
**    fonts-dejavu-core \**
** && apt-get clean && rm -rf /var/lib/apt/lists/***

PS: Ich habe die neuste Version eingebunden, aber auch mit älteren Versionen klappt das nicht:

Viele Grüße und vielen Dank
Holger

Die Meldung scheint zu sagen, dass irgendwo in deinem Container eine veraltete Version von libSkiaSharp.so liegt. Im aktuellen Packsge hier

ist definitiv eine neuere / passende Version enthalten.

  • welche Version genau referenzierst du? Kannst du mal dein volles *. csproj posten?
  • welches Basisimage verwendest du? Kannst du mal das volle dockerfile posten?

Hallo Jochen,

vielen Dank für die schnelle Info, ich habe das Paket manuell in meinem Projekt hinzugefügt und auch euer eigenes NuGet Feed in die Dockerfile hinzugefügt und dann geht es auch und ich bin wieder glücklich :slight_smile:
Das Veröffentlichen über den Assistenten von Visual Studio habe ich auch nicht mehr weiter verfolgt, sondern habe mir ein PowerShell-Script zum veröffentlichen geschrieben, da ich dort zusätzlich bestimmte Variable anlegen/aktualisieren lassen kann ohne manuell nochmals Hand anzulegen.

Wenn ihr noch einen Betatester benötigt, würde ich mich zur Verfügung stellen :slight_smile:

Habt ihr eine kleine Seite, wo man die Änderungen in den einzelnen Versionen “31.1.0-stable.216” nachlesen kann? Ich freue mich schon auf den Excel export und würde diesen direkt mit meinen Berichten testen.

Eigentlich ist es doch so, dass die Abhängigkeiten automatisch heruntergeladen werden. (?)
Oder bin ich gerade verwirrt :rofl:

# --- Runtime Image ---
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base
WORKDIR /app
EXPOSE 8080

# --- Build Image ---
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src

# Nur die WebAPI + ihre direkten Dependencies kopieren (NICHT die .sln!)
COPY MYAPP/src/Web/MYAPP.WebAPI/MYAPP.WebAPI.csproj MYAPP/src/Web/MYAPP.WebAPI/
COPY MYAPP/_Referenzen/ MYAPP/_Referenzen/
COPY myFramework.Core/src/ myFramework.Core/src/

# --- Combit NuGet Feed hinzufügen ---
RUN dotnet nuget add source "https://nuget.combit.net/nuget" \
    --name combit

# Restore NUR die WebAPI (keine Solution → keine unnötigen Projekte)
RUN dotnet restore "MYAPP/src/Web/MYAPP.WebAPI/MYAPP.WebAPI.csproj"

# Restlichen Code kopieren
COPY . .

# Build
WORKDIR /src/MYAPP/src/Web/MYAPP.WebAPI
RUN dotnet build "MYAPP.WebAPI.csproj" -c $BUILD_CONFIGURATION -o /app/build

# --- Publish Image ---
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
WORKDIR /src/MYAPP/src/Web/MYAPP.WebAPI
RUN dotnet publish "MYAPP.WebAPI.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

# --- Final Image ---
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .

USER root

# Install native dependencies required by List & Label Cross Platform
RUN apt-get update && apt-get install -y \
    libc6 \
    libfontconfig1 \
    libfreetype6 \
    libpng16-16 \
    libjpeg62 \
    libgif7 \
    fonts-dejavu-core \
 && apt-get clean && rm -rf /var/lib/apt/lists/*

ENTRYPOINT ["dotnet", "MYAPP.WebAPI.dll"]

Hier noch der Inhalt der “*.csproj”-Datei.

<PropertyGroup>
  <TargetFramework>net10.0</TargetFramework>
  <ImplicitUsings>enable</ImplicitUsings>
  <Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
  <PackageReference Include="combit.ListLabel31.CrossPlatform" Version="31.1.0-stable.216" />
  <PackageReference Include="SkiaSharp.NativeAssets.Linux" Version="3.119.2-preview.1" />
</ItemGroup>

Ja, die Abhängigkeiten werden automatisch hinzugefügt. Allerdings haben wir explizit keine Abhängigkeit auf genau dieses Package, da ja nicht jedes Deployment auf Linux läuft und sonst auch Windows-Installationen das Linux Package mitliefern würden. Genau deswegen muss das Package manuell hinzugefügt werden.

Ein Readme für die Zwischenversionen haben wir aktuell leider nicht. Mit dem Service Pack wird dann natürlich die komplette Dokumentation nachgeliefert.

Vielen Dank für dein Angebot, als Betatester bereit zu stehen. Das ist durchaus interessant, der Excel -Export nimmt allmählich schon Formen an, gegebenenfalls kommen wir da gerne auf dich zurück.

Wir haben auch ein Early Adopter Programm für LLCP. Wenn du daran Interesse hättest kannst du dich gerne per E-Mail bei mir melden.

Ich nehme mit, dass bei dir jetzt erstmal alles funktioniert? :slight_smile:

Guten Morgen Jochen,

genau, ich konnte alle meine Probleme lösen und werde nur noch LLCP :beating_heart: nutzen.
Ich danke Dir für deinen schnelle Hilfe und Unterstützung.

Per E-Mail werde ich mich auf jeden Fall melden.

Viele Grüße und vielen Dank
Holger

1 Like