Windows Forms exe kleiner machen?
Hallo!
Ich habe eine Windows Forms App in .net7 geschrieben. Die exe die beim publishen heraus kommt, soll eigenständig sein (das framework enthalten) und möglichst klein sein. ich habe aktuell ca 1200 LoC, und komme damit auf knapp 150MB.
Bei .net7 Konsolenanwendungen war ich es gewohnt, PublishTrimmed auf true zu setzen, außerdem habe ich immer diese Einstellungen vorgenommen:
<TrimmerRootAssembly Include="assemblyName" TrimMode="copy" />
und
<linker>
<assembly fullname="assemblyName" preserve="all"/>
</linker>
diese Einstellungen haben mich bei einer Konsolenanwendung auf unter 15 mb gebracht (inkl. runtime)
Leider habe ich bei der Windows Forms app (beim publishen, mit PublishTrimmed auf true), die Meldung bekommen: "Windows Forms wird nicht unterstützt oder empfohlen, wenn das Zuschneiden aktiviert ist.".
Ich hoffe auf eure Hilfe, um die exe kleiner zu machen.. 150mb ist doch ziemlich extrem für so eine kleine Anwendung ohne dependencies.
Vielleicht habt ihr ja noch irgendwelche Tipps, online habe ich leider nichts gefunden was weiterhilft^^
Liebe Grüße,
Oli
1 Antwort
Trimming ist bei Anwendungen, die mit Reflection oder COM-Marshalling arbeiten, problematisch, denn während des Analyseprozesses kann nur schwer beurteilt werden, was denn raus darf oder nicht. Windows Forms ist an der Stelle besonders betroffen, denn es baut unter Haube wesentlich auf COM-Marshalling. Eine mögliche Lösung an der Stelle ist die Nutzung von COM-Wrappern (siehe z.B. WinFormsComInterop).
Zusätzlich solltest du den Microsoft-Artikel Prepare libraries for trimming durcharbeiten.
Eine Garantie dafür, dass du es schaffst, gibt es aber nicht. Seitens des .NET-Teams (lies hier) gibt es jedenfalls noch keinen offiziellen Support. Einen Überblick über den aktuellen Entwicklungsstatus liefert dieses Epic: #4649 Make WinForms trim compatible.
Noch ein paar andere Optionen, die du ausprobieren/angehen könntest:
- Deploye die App im Release-Modus.
- Gehe diese Liste an Features durch. Sicherlich kannst du einige von ihnen ausschließen.
- Schau, ob es im Projekt Dateien gibt, die explizit exkludiert werden können und markiere sie entsprechend.
- Komprimiere Mediendateien (u.ä. externe Ressourcen), die du möglicherweise nutzt.
- Mit einem Packer/Kompressor kannst du deine Executable nochmals komprimieren (siehe bspw. NeoLite oder UPX).
- Etwas, was man fallbedingt einfach einmal testen müsste: Eine Aufteilung in Assemblies und dazu ein partielles Trimming.
wow super danke!! diesen überblick habe ich gebraucht, so kann ich weiterarbeiten :) sehr nett, liebe grüße
@regex9
Auch meinerseits ein Lob an Sie.
Wie kann man nur so schlau sein. Respekt. Da möchte ich auch hin. Sie sind nun auch ab sofort mein Vorbild. Offiziell bin ich auch ein Fan von Ihnen.