Laden...

SingleFile-App

Erstellt von Torni vor 3 Jahren Letzter Beitrag vor 3 Jahren 288 Views
T
Torni Themenstarter:in
50 Beiträge seit 2014
vor 3 Jahren
SingleFile-App

Hiho,

ich habe jetzt verschiedene Builds probiert um ein Single-File wie noch vor .net5 zu erstellen.

Ich bekomme entweder

  • ein 60MB großes File in einer .exe was vorher 200KB hatte (.dotnet in selfextract)
  • eine 200KB große .exe mit einer zusätzlichen .dll (gleicher Name wie die .exe)
  • ein Ausgabeordner mit sämtlichen .dll der .dotnet (auch im publish-ordner)

Ist es nicht mehr möglich wie bisher kurze knappe .exe zu erzeugen (ohne die zusätzliche gleichnamige .dll) ??

Property z.B:



  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <PublishSingleFile>true</PublishSingleFile>
    <SelfContained>true</SelfContained>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <PublishTrimmed>true</PublishTrimmed>
    <PublishReadyToRun>true</PublishReadyToRun>
  </PropertyGroup>

16.842 Beiträge seit 2008
vor 3 Jahren

Mit der Config, die Du hier zeigst, erzeugst Du eine Single File App mit der eingebetteten Runtime (Self Contained).
Ist klar, dass Du damit eine 60 MB App erzeugst; die Erwartung von 200 KB ist vermutlich ohne Runtime.
Das war auch schon unter .NET 3 so - also keine Schuld der CLI sondern entspricht exakt dem, was Du in der Config angegeben hast.

Der Prozess sieht weiterhin vor, dass Du native DLLs hast oder haben könntest, die nicht eingebettet werden können. Dann sind diese auch nicht dem Single-File enthalten.
Dafür gibts dann noch die Config


<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>

Das Mergen funktioniert auch so, dass die Grundanwendung Systemneutral ist und es dann leider noch DLLs gibt, die pro Betriebssystem erzeugt werden.
In Deinem Fall ist es so, dass Du für Windows das Ding erzeugst und da wird dann auch leider aktuell noch die DLL daneben gelegt. Auch das war in .NET 3 bereits so.

Hinzu kommt, dass manche Applikationen nicht als einzelne Dateien lauffähig sind; zB. ist eine Single-Managed ASP.NET Core DLL nicht in IIS Hosted Modell betreibbar, weil der IIS nur unmanaged DLLs lädt.
Ergo kommt auch hier keine Single-File App am Ende raus, aufgrund der Dependencies.

Siehe Support Single-File Apps in .NET 5

PS: Um keine Lizenzverletzungen bei Single Apps zu begehen, gibt es dann zB noch ExcludeFromSingleFile.
Beispielsweise LGPL fordert die Austauschbarkeit von Abhängigkeiten, was bei einem Full-Merge nicht mehr gegeben wäre.