Najlepsze Praktyki ILMerge

Używasz ILMerge? Czy używasz ILMerge do łączenia wielu zestawów w celu ułatwienia wdrażania bibliotek dll? Czy znalazłeś problemy z wdrożeniem/wersjonowaniem w produkcji po łącznym łączeniu zestawów?

Szukam rady odnośnie stosowania ILMerge w celu zmniejszenia tarcia wdrożeniowego, jeśli jest to w ogóle możliwe.

Author: ckittel, 2008-08-13

12 answers

Używam ILMerge do prawie wszystkich moich różnych zastosowań. Mam go zintegrowany bezpośrednio z procesem budowania wydania, więc to, co kończę, to jeden exe na aplikację bez dodatkowych dll.

Nie można dodawać żadnych zestawów C++, które mają natywny kod. Nie można też dodawać żadnych zestawów zawierających XAML dla WPF(przynajmniej mi się to nie udało). Skarży się w czasie wykonywania, że zasoby nie mogą być zlokalizowane.

Napisałem plik wykonywalny wrappera dla ILMerge gdzie przekazuję nazwę exe startowego dla projektu, który chcę połączyć, i wyjściową nazwę exe, a następnie odzwierciedla zależne zespoły i wywołuje ILMerge z odpowiednimi parametrami wiersza poleceń. Teraz jest o wiele łatwiej, gdy dodaję nowe zestawy do projektu, nie muszę pamiętać, aby zaktualizować skrypt budowania.

 38
Author: Lamar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-30 13:16:54

Wprowadzenie

Ten post pokazuje, jak zastąpić wszystkie .exe + .dll files pojedynczym combined .exe. Zachowuje również plik debugowania .pdb nienaruszony.

Dla Aplikacji Konsolowych

Oto podstawowe Post Build String dla Visual Studio 2010 SP1, używając. NET 4.0. Buduję konsolę .exe ze wszystkimi sub-.zawarte w nim pliki dll.

"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(TargetDir)$(TargetName).all.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards

Podstawowe wskazówki

  • wyjściem jest plik " AssemblyName.all.exe", który łączy wszystkie biblioteki podrzędne DLL w jeden .exe.
  • zwróć uwagę na katalog ILMerge\. Ty trzeba albo skopiować narzędzie ILMerge do katalogu rozwiązania(aby można było rozpowszechniać źródło bez martwienia się o dokumentowanie instalacji ILMerge), lub zmienić tę ścieżkę, aby wskazać, gdzie ILMerge.exe.

Zaawansowane wskazówki

Jeśli masz problemy z tym, że nie działa, włącz {[8] } i wybierz Show output from: Build. Sprawdź dokładne polecenie wygenerowane przez Visual Studio i sprawdź, czy nie występują błędy.

Przykładowy Skrypt Budowy

Ten skrypt zastępuje wszystkie .exe + .dll files pojedynczym combined .exe. Zachowuje również debugowanie .plik pdb nienaruszony.

Aby użyć, wklej to w swoim kroku Post Build, w zakładce Build Events w projekcie C#, i upewnij się, że dostosujesz ścieżkę w pierwszej linii, aby wskazywała na ILMerge.exe:

rem Create a single .exe that combines the root .exe and all subassemblies.
"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(TargetDir)$(TargetName).all.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards
rem Remove all subassemblies.
del *.dll
rem Remove all .pdb files (except the new, combined pdb we just created).
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).all.pdb.temp"
del *.pdb
ren "$(TargetDir)$(TargetName).all.pdb.temp" "$(TargetName).all.pdb"
rem Delete the original, non-combined .exe.
del "$(TargetDir)$(TargetName).exe"
rem Rename the combined .exe and .pdb to the original project name we started with.
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).pdb"
ren "$(TargetDir)$(TargetName).all.exe" "$(TargetName).exe"
exit 0
 39
Author: Contango,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-30 17:01:38

Używamy ILMerge na blokach aplikacji Microsoft - zamiast 12 oddzielnych plików DLL, mamy jeden plik, który możemy przesłać do naszych obszarów klienckich, Plus struktura systemu plików jest znacznie lepsza.

Po połączeniu plików musiałem edytować listę projektów visual studio, usunąć 12 osobnych assmeblies i dodać pojedynczy plik jako odniesienie, w przeciwnym razie narzekałbym, że nie może znaleźć konkretnego zespołu. Nie jestem zbyt pewien, jak to będzie działać na wdrożeniu po, może warto spróbować.

 9
Author: Surgical Coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-14 13:00:50

Wiem, że to stare pytanie, ale nie tylko używamy ILMerge do zmniejszenia liczby zależności, ale także do internalizacji" wewnętrznych " zależności (np. automapper, restsharp, itp.), które są używane przez narzędzie. Oznacza to, że są one całkowicie abstrakcyjne, a projekt korzystający z połączonego narzędzia nie musi o nich wiedzieć. To ponownie zmniejsza wymagane odniesienia w projekcie i pozwala mu używać / aktualizować własną wersję tej samej biblioteki zewnętrznej, jeśli jest to wymagane.

 6
Author: Mightymuke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-03 01:53:42

Używamy ILMerge w kilku projektach. Na przykład Web Service Software Factory produkuje coś w rodzaju 8 zespołów jako wyjście. Łączymy wszystkie te biblioteki DLL w jedną bibliotekę DLL tak, że host usługi będzie musiał odwołać się tylko do jednej biblioteki DLL.

To sprawia, że życie jest nieco łatwiejsze, ale to też nic wielkiego.

 3
Author: Esteban Araya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-13 04:31:44

Mieliśmy ten sam problem z połączeniem zależności WPF .... ILMerge chyba się tym nie zajmuje. Costura.Fody pracował dla nas jednak doskonale i zajęło około 5 minut, aby przejść... bardzo dobre doświadczenie.

Wystarczy zainstalować za pomocą Nuget (wybierając właściwy Domyślny projekt w konsoli Menedżera pakietów). Wprowadza się do projektu docelowego i domyślne ustawienia działały od razu dla nas.

Łączy wszystkie biblioteki DLL oznaczone "Copy Local" = true i tworzy połączenie .EXE (obok standardowego wyjścia), który jest ładnie skompresowany w rozmiarze (znacznie mniejszym niż całkowity rozmiar wyjścia).

Licencja jest MIT, więc można modyfikować / dystrybuować zgodnie z wymaganiami.

Https://github.com/Fody/Costura/

 3
Author: rexall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-13 14:16:48

WinForms) będziesz chciał użyć / target: winexe switch.
/target: exe switch tworzy scaloną konsolę aplikację.

 2
Author: dlchambers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-28 13:36:45

Napotkaliśmy problemy podczas łączenia bibliotek DLL, które mają zasoby w tej samej przestrzeni nazw. W procesie scalania zmieniono nazwę jednej z przestrzeni nazw zasobu, przez co zasoby nie mogły zostać zlokalizowane. Może po prostu robimy coś nie tak, wciąż badając ten problem.

 1
Author: Patrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 11:43:20

Właśnie zaczęliśmy używać ILMerge w naszych rozwiązaniach, które są redystrybuowane i wykorzystywane w innych naszych projektach i jak dotąd dobre. Wszystko wydaje się działać dobrze. Nawet zaciemniliśmy bezpośrednio zapakowany zespół.

Rozważamy zrobienie tego samego z zestawami bibliotek MS Enterprise.

Jedynym prawdziwym problemem, jaki widzę w tym pakiecie, jest wersjonowanie poszczególnych zestawów.

 0
Author: markom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-14 13:04:08

Ostatnio miałem problem gdzie miałem ilmerged assembly w assembly miałem kilka klas te były nazywane przez reflection w Umbraco opensource CMS.

Informacja do wywołania przez reflection została zaczerpnięta z tabeli db, która miała nazwę asemblera i przestrzeń nazw klasy, która zaimplementowała i interfejs. Problem polegał na tym, że wywołanie reflection nie powiedzie się, gdy dll został połączony, jednak jeśli dll był oddzielny, wszystko działało dobrze. Myślę, że problem może być podobny do tego, który longeasy jest mieć?

 0
Author: Ismail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-30 14:35:05

Dopiero zaczynam używać ILMerge jako części mojego CI build, aby połączyć wiele drobnoziarnistych kontraktów WCF w jedną bibliotekę. Działa bardzo dobrze, jednak nowa scalona lib nie może łatwo współistnieć ze swoimi bibliotekami składowymi, ani z innymi bibliotekami zależnymi od tych bibliotek składowych.

Jeśli w nowym projekcie odwołasz się zarówno do biblioteki ILMerged, jak i do starszej biblioteki, która zależy od jednego z danych wejściowych, które dałeś ILMerge, przekonasz się, że nie możesz przekazać żadnego typu z ILMerged lib do dowolnej metody w starszej bibliotece bez wykonywania jakiegoś rodzaju mapowania typu(np. automapper lub ręczne mapowanie). Dzieje się tak dlatego, że gdy wszystko jest skompilowane, typy są skutecznie kwalifikowane za pomocą nazwy złożenia.

Nazwy również się zderzają, ale możesz to naprawić używając extern alias .

Radzę unikać umieszczania w Twoim scalonym asemblem publicznie dostępnych lib, które twój scalony asemblem wyświetla (np. poprzez typ zwracany, metodę / konstruktor parametr, pole, właściwość, rodzaj...) chyba że wiesz na pewno, że użytkownik twojego scalonego zestawu nie jest i nigdy nie będzie zależał od wolnostojącej wersji tej samej biblioteki.

 0
Author: Steve Pick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-29 18:41:11

Wydaje mi się, że najlepszą praktyką nr 1 ILMerge jest nie używać ILMerge. Zamiast tego użyj SmartAssembly . Jednym z powodów jest to, że najlepszą praktyką ILMerge #2 jest zawsze uruchamianie PEVerify po wykonaniu programu ILMerge, ponieważ ILMerge nie gwarantuje, że poprawnie połączy zespoły w poprawny plik wykonywalny.

Inne Wady ILMerge:

  • podczas scalania usuwa Komentarze XML (jeśli mi na tym zależy, użyłbym narzędzia zaciemniania)
  • to nie poprawnie obsłużyć tworzenie odpowiedniego .plik pdb

Kolejnym narzędziem, na które warto zwrócić uwagę jest Mono.Cecil i Mono.Narzędzie Linker [2].

[2]: http:// www.mono-project.com/Linker

 -1
Author: user429921,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-24 21:14:23