Merge libraries into single executable

Osobiście preferuję, kiedy aplikacje składają się z pojedynczego pliku wykonywalnego – czysta wygoda i kompaktowość.
Jednakże, przy standardowej pracy ze stacjonarnymi aplikacjami .NET często wynikiem ich kompilacji jest całe stado plików dll i jeden (bądź więcej) plik exe.

Oczywiście wcale nie musi tak być – możemy spokojnie zastąpić cały zestaw zależności pojedynczym plikiem exe.

Opcji mamy kilka:

  • Costura.Fody
  • ILMerge
  • Mono.Cecil

Wszystkie mają swoje zastosowania przy projektach określonego rodzaju.

Costura.Fody

Jest najprostszym w użyciu narzędziem – wystarczy dodać NuGet package do projektu aplikacji i gotowe.
Automatycznie wszystkie używane przez dany projekt biblioteki zostaną wpisane w plik wykonywalny.

Dodatkowo warto wykorzystać komendę powershella “Install-CleanReferencesTarget”, aby folder bin czyścił się ze zbędnych już plików dll.

ILMerge

Jest małym narzędziem w formie pliku exe.
Sprawdza się w sytuacjach, kiedy nie możemy skorzystać z Fody.

Np. w poprzednim poście wspominałem, że ClojureCLR generuje pliki dll w stosunku 1:1 z plikami clj.
Więc aby skorzystać z całego silnika RL-Engine musielibyśmy dodać wpierdyliard referencji.

Fody odpada tutaj, bo kompilujemy kod zewnętrznym narzędziem.

Skorzystajmy zatem z ILMerge aby zamienić nasz zestaw dll na pojedynczą bibliotekę:

ILMerge.exe /out:"rl-engine.dll" "*.dll" 
            /target:library 
            /targetplatform:v2,C:\Windows\Microsoft.NET\Framework\v2.0.50727 
            /wildcards

PS: w tym przypadku załączamy również cały Clojure runtime (paczkę NuGetową z ClojureCLR), więc nasza biblioteka jest w pełni samowystarczalna.

Mono.Cecil

Analogiczne narzędzie do ILMerge.
Dużym plusem jest to, że wspiera Mono (obviously) i jest open source.
Niestety z Cecilem nie miałem przyjemności pracować.

Im mniej tym lepiej

Warto pamiętać, że istnieje możliwość pozbycia się całej chmary plików – szczególnie przy tworzeniu narzędzi czy aplikacji desktopowych.

Z kolei dla aplikacji webowych czy bardziej zaawansowanych systemów, jest to raczej zbędny feature.

Be First to Comment

A penny for your thoughts