Rozwój w Winform/WPF nieuchronnie odnosi się do wielu zewnętrznych DLL, ale za każdym razem, gdy je pakujesz, musisz skopiować pliki z katalogu Debug do klienta lub je udostępnić, co nie jest zbyt wygodne w użyciu. Próbowałem już kilku programów do łączenia plików dll, takich jak ILMerge, Enigma Virtual Box itd., ale dopóki nie dowiedziałem się o "Costura.Fody", czułem, że świat jest o wiele lepszy~
Poniżej znajduje się program napisany przez Winform, odnoszący się do dwóch DLL: "HttpHelper.dll" i "Newtonsoft.Json.dll". Podczas generowania programu pojawia się plik exe oraz te dwa pliki DLL, co sprawia, że ludzie czują się bardzo niekomfortowo, a jeśli jest o jedno DLL mniej, program może zgłosić wyjątek, jak pokazano na poniższym rysunku:
Poniższy link przedstawia poprzednie użycie (niezalecane)
Za pomocą narzędzia Costura.Fody możesz połączyć źródłowe DLL z docelowym EXE
Strona główna projektu: https://github.com/Fody/Costura
Jak użyć, bezpośrednio zainstalować pakiet Nuget:
Po pomyślnym dodaniu Costura.Fody, rozwiązanie automatycznie doda FodyWeavers.xml plik.
Wygeneruj rozwiązanie ponownie, możesz zobaczyć swój sukces w katalogu generowania programów, wszystkie DLL są idealnie połączone z plikiem exe, możesz bezpośrednio skopiować plik exe do klienta, aby działał niezależnie. Jak pokazano poniżej:
1>------ Wszystkie przebudowy zostały rozpoczęte: Project: itsvse, Konfiguracja: Debuguj dowolny procesor ------ 1> Fody: Fody (wersja 2.0.0.0) Wykonanie 1> Fody/Costura: Nie znaleziono żadnej wzmianki o 'Costura.dll'. Przypisy niezmienione. 1> Fody/Costura: Osadzanie 'E:\project\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura: Osadzanie 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll' 1> Fody: Ukończył Fody 609ms. 1> Fody: Pominięto Weryfikację asemblera, ponieważ jest wyłączona w konfiguracji 1> Fody: Zakończona weryfikacja w 3ms. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Regeneruj wszystkich: 1 się udało, 0 nieudanych i 0 ========== pomijanych
Jak widać na powyższym zdjęciu, wygenerowany plik nie zawiera Newtonsoft.Json.dll, HttpHelper.dll i Costura.dll nie są generowane, tylko dwa pliki, itsvse.exe można uruchomić bezpośrednio bez błędów! (Plik PDB można usunąć).
Użyjmy narzędzia ILSpy, aby zdekompilować nasz program i przyjrzeć się wygenerowanemu kodowi źródłowem, jak pokazano na poniższym rysunku:
Wprowadzenie do zasady wdrożenia
Gdy CLR próbuje załadować asemble, ale nie udaje się go załadować, podnosi zdarzenie AppDomain.AssemblyResolve. Nasz program może nasłuchiwać tego zdarzenia i zwrócić asembl, który CLR próbuje załadować do obsługi zdarzeń, aby program mógł działać normalnie.
Fody.Costura osadza wszystkie DLL odwołane przez EXE do pliku EXE podczas budowania projektu. Gdy program używa jednego z tych DLL podczas wykonywania (zdarzenie AppDomain.AssemblyResolve jest wyzwalane, ponieważ CLR nie może znaleźć pliku DLL), wymagany DLL jest wyodrębniany z wbudowanych zasobów pliku EXE.
Widać, że metoda Attach nasłuchuje zdarzenia AppDomain.AssemblyResolve. Gdy CLR nie załaduje asemblera, uruchamiany jest handler zdarzeń AssemblyResolve. AssemblyResolve próbuje pobrać docelowy zespół z wbudowanego zasobu załadowanego zespołu za pomocą metody Common.ReadFromEmbeddedResources i zwraca go do CLR.
Widząc to, możesz zapytać, kiedy wprowadzono metodę Attachment?
W rzeczywistości dla języka C# CLR ukrywa dużą sztuczkę – CLR może wykonać zainicjalizowany kod przed załadowaniem każdego modułu (każdy asembler zawiera jeden lub więcej modułów). Niestety, język C# nie ma kontroli nad tą częścią kodu. Fody.Costura wstrzykuje kod IL bezpośrednio do funkcji inicjalizacji wewnętrznego modułu asemblera EXE, a ta część kodu IL faktycznie wykonuje metodę Przyłączenia. Dzięki temu, gdy asembl EXE zostanie załadowany, można natychmiast wywołać metodę Przyłącz.
Powyższe to krótkie wprowadzenie do zasady wdrożenia Fody.Costura.
Konfiguracja zaawansowana
Konfiguracje te są dodawane lub modyfikowane w CosturaFodyWeavers.xml plikach.
CreateTemporaryAssemblies Domyślne: fałszywe To osadza osadzony plik na dysku przed załadowaniem go do pamięci. Jest to przydatne w niektórych sytuacjach, gdy chcesz załadować asembl z fizycznego pliku.
IncludeDebugSymbols Domyślne: prawdziwe Kontroluje, czy .pdbs zespołu referencyjnego są również osadzone.
Wyłącz kompresję Domyślne: fałszywe Osadzone zespoły są domyślnie kompresowane i niekompresowane podczas ładowania. Możesz wyłączyć kompresję korzystając z tej opcji. Uwaga: Pamiętaj, aby wyłączyć tę właściwość podczas odwoływania się do niestandardowych DLL lub zaszyfrowanych DLL. W przeciwnym razie doprowadzi to do sytuacji, w której pliku exe nie będzie można otworzyć. Odkryłem to, gdy używałem DSkin.dll.
Wyłącz Czyszczenie Domyślne: fałszywe W ramach Costura, wbudowane komponenty nie są już uwzględniane w budowie oprogramowania. To sprzątanie można wyłączyć.
LoadAtModuleInit Domyślne: prawdziwe Costura jest domyślnie ładowana jako część inicjalizacji modułu. Flaga wyłącza to zachowanie. Upewnij się, że możesz gdzieś użyć CosturaUtility.Initialize().
WykluczyćZgromadzenia Jak używać: ExcludeAssemblies="DLL1| DLL2" Lista nazw asemblerow, które należy wykluczyć z domyślnej akcji "osadz wszystkie lokalne referencje kopiowania".
IncludeAssemblies Jak użyć: IncludeAssemblies="DLL1| DLL2" Lista nazw asemblerzy zawartych w domyślnej akcji Embedding All Copy Local References.
Unmanaged32Assemblies&Unmanaged64Assemblies Jak go używać: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" Zestawy w trybie mieszanym nie mogą być ładowane w taki sam sposób jak zarządzane. Aby pomóc Costurze zidentyfikować, które komponenty są w trybie mieszanym i w których środowiskach je załadować, ich nazwy powinny być uwzględnione na jednej lub obu listach. Nie włączaj .exe ani .dll w nazwie.
Kolejność wstępnego ładowania Użycie: PreloadOrder="DLL1| DLL2" Biblioteki lokalne mogą być automatycznie ładowane przez Custa. Aby dołączyć lokalną bibliotekę, umieść ją w projekcie jako wbudowany zasób zwany folderem costura32 lub costura64, w zależności od niestabilności biblioteki. Alternatywnie możesz określić kolejność ładowania, w jakiej wstępnie załadowane są biblioteki. Gdy mieszasz tymczasowe komponenty z dysku, są one również wstępnie załadowane.
CosturaUtility Jak użyć:
CosturaUtility to klasa, która pozwala ręcznie inicjalizować system Costura w twoim kodzie.Dotyczy to głównie sytuacji, gdy program inicjalizacji modułu nie działa, takich jak biblioteki i Mono.
Na koniec pobierz kod źródłowy w tekście:
Turyści, jeśli chcecie zobaczyć ukrytą zawartość tego wpisu, proszę Odpowiedź
|