Winform/wpf-utveckling syftar oundvikligen på många tredjeparts-DLL:er, men varje gång du paketerar det måste du kopiera filerna i Debug-katalogen till kunden eller dela dem, vilket inte är särskilt bekvämt att använda. Jag har provat flera program för att slå ihop dll-filer tidigare, som ILMerge, Enigma Virtual Box, etc., men tills jag lärde mig om "Costura.Fody" kände jag att världen var mycket bättre~
Följande är ett program skrivet av Winform, som refererar till de två DLL-filerna "HttpHelper.dll" och "Newtonsoft.Json.dll"; när vi genererar programmet finns det en exe-fil och dessa två DLL-filer, vilket gör folk mycket obekväma, och om det finns en DLL mindre kan programmet rapportera ett undantag, som visas i figuren nedan:
Länken nedan visar tidigare användning (rekommenderas inte)
Med hjälp av verktyget Costura.Fody kan du slå ihop käll-DLL:n med mål-EXE:n
Projektets hemsida: https://github.com/Fody/Costura
Hur man använder och installerar nuget-paketet direkt:
När du framgångsrikt har lagt till Costura.Fody kommer lösningen automatiskt att lägga till FodyWeavers.xml fil.
Generera lösningen igen, du kan se din framgång i programgenereringskatalogen, alla DLL-filer är perfekt sammanslagna i exe:n, du kan kopiera exe-filen direkt till klienten för att köra den oberoende av dem. Som visas nedan:
1>------ Alla ombyggnader har startats: Projekt: itsvse, Konfiguration: Felsökning Vilken CPU som helst ------ 1> Fody: Fody (version 2.0.0.0) körs 1> Fody/Costura: Ingen referens till 'Costura.dll' hittades. Referenser är inte ändrade. 1> Fody/Costura: Inbäddning av 'E:\project\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura: Inbäddning av 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll' 1> Fody: Färdigställde Fody med 609 ms. 1> Fody: Hoppade över verifiering av assembly eftersom den är inaktiverad i konfigurationen 1> Fody: Färdigställde verifieringen på 3 ms. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Regenerera alla: 1 lyckas, 0 misslyckas och 0 ========== hoppade över
Som kan ses på bilden ovan innehåller den genererade filen inte Newtonsoft.Json.dll, HttpHelper.dll och Costura.dll genereras inte, endast två filer, itsvse.exe kan köras direkt utan fel! (PDB-filen kan tas bort).
Låt oss använda ILSpy-verktyget för att dekompilera vårt program och titta på den genererade källkoden, som visas i figuren nedan:
Introduktion till implementeringsprincipen
När CLR försöker ladda en assembler men misslyckas med att ladda, aktiveras AppDomain.AssemblyResolve-händelsen. Vårt program kan lyssna efter denna händelse och returnera den assembler som CLR försöker ladda i händelsehanteraren så att programmet kan fortsätta fungera normalt.
Fody.Costura bäddar in alla DLL-filer som refereras till av EXE:n i EXE-filen när projektet byggdes. När ett program använder en av dessa DLL:er under körning (AppDomain.AssemblyResolve-händelsen triggas eftersom CLR inte kan hitta DLL-filen), extraheras den nödvändiga DLL:en från de inbäddade resurserna i EXE-filen.
Du kan se att metoden Attach lyssnar på händelsen AppDomain.AssemblyResolve. När CLR misslyckas med att ladda en assembler framgångsrikt, körs AssemblyResolve-händelsehanteraren. AssemblyResolve försöker hämta målassembleren från den inlästa assemblyns inbäddade resurs via metoden Common.ReadFromEmbeddedResources och returnerar den till CLR.
När du ser detta kanske du undrar, när implementerades Atta-metoden?
Faktum är att för C#-språket döljer CLR ett stort knep – CLR kan köra initierad kod innan varje modul (varje assembler innehåller en eller flera moduler) laddas. Tyvärr har C#-språket ingen kontroll över denna del av koden. Fody.Costura injicerar IL-kod direkt i initialiseringsfunktionen för den interna modulen i EXE-assembleren, och denna del av IL-koden kör faktiskt Attach-metoden. På så sätt kan Attach-metoden anropas omedelbart när EXE-assembleren är laddad.
Ovan är en kort introduktion till implementeringsprincipen för Fody.Costura.
Avancerad konfiguration
Dessa konfigurationer läggs till eller modifieras i CosturaFodyWeavers.xml filer.
SkapaTemporärFörsamlingar Standard: falskt Detta bäddar in den inbäddade filen på disken innan den laddas in i minnet. Detta är användbart i vissa situationer där du vill ladda en assembler från en fysisk fil.
InkluderaDebugSymboler Standard: sant Styr om referenssammansättningens .pdb-filer också är inbäddade.
InaktiveraKomprimering Standard: falskt Inbäddade sammansättningar komprimeras som standard och okomprimeras när de laddas. Du kan stänga av komprimering med detta alternativ. Obs: Se till att stänga av denna egenskap när du refererar till icke-standardiserade DLL:er eller krypterade DLL:er. Annars leder det till att exe-filen inte kan öppnas. Detta upptäcktes när jag använde DSkin.dll.
DisableCleanup Standard: falskt Som en del av Costura ingår inte längre inbyggda komponenter i bygget. Denna städning kan stängas av.
LoadAtModuleInit Standard: sant Costura laddas som standard som en del av modulens initialisering. Flaggan inaktiverar beteendet. Se till att du kan använda CosturaUtility. Initialize() någonstans.
ExklusionFörsamlingar Hur man använder: ExcludeAssemblies="DLL1| DLL2" En lista över assemblernamn att utesluta från standardåtgärden "bädda in alla lokala referenser".
Inkludera Församlingar Hur man använder: IncludeAssemblies="DLL1| DLL2" En lista över assemblernamn som ingår i standardåtgärden Inbäddning av alla kopiera lokala referenser.
Unmanaged32Assemblies&Unmanaged64Assemblies Hur man använder den: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" Mixed-mode-assemblies kan inte laddas på samma sätt som hanterade assemblies. Därför, för att hjälpa Costura att identifiera vilka komponenter som är i blandat läge och i vilka miljöer de ska laddas, bör deras namn inkluderas i en eller båda listorna. Inkludera inte .exe eller .dll i namnet.
PreloadOrder Användning: PreloadOrder="DLL1| DLL2" Lokala bibliotek kan automatiskt laddas av Costura. För att inkludera ett lokalt bibliotek, inkludera det i ditt projekt som en inbäddad resurs kallad mapp costura32 eller costura64 beroende på bibliotekets instabilitet. Alternativt kan du ange laddningsordningen som de förladdade biblioteken laddas i. När du blandar temporära komponenter från disken är de också förladdade.
CosturaUtility Hur man använder:
CosturaUtility är en klass som låter dig manuellt initiera Costura-systemet i din egen kod.Detta gäller främst för situationer där modulinitieringsprogrammet inte fungerar, såsom bibliotek och Mono.
Slutligen, ladda ner källkoden i texten:
Turister, om ni vill se det dolda innehållet i detta inlägg, snälla Svar
|