Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 219600|Svar: 43

[WinForm] .net/c# Använd Costura.Fody för att paketera DLL:n till EXE:n

[Kopiera länk]
Publicerad på 2018-04-14 14:41:49 | | | |
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)

C# paketerar dll:n i exe:ns program
http://www.itsvse.com/thread-2841-1-1.html
(Källa: Architect_Programmer)



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ällaSvar





Föregående:StreamReader-lösning för förvrängda tecken vid filläsning
Nästa:Lösningar för konflikter mellan Hyper-V och VirtualBox samt VMware
Publicerad på 2018-06-07 09:35:19 |
Prova den här metoden för att integrera beroendekomponenten Dll i C#-kompilerad EXE!

Om den är lätt att använda, kom ihåg att berömma den! Haha, det här, lägg bara till Dll i resursfilen, enkelt och praktiskt! (Jag förstår inte, jag kan komma på en handledning) @小渣渣

 Hyresvärd| Publicerad på 2018-06-06 10:30:42 |
Om du skriver under ett program kommer du att få följande fel:

1>MSBUILD : fel : Fody: Ett ohanterat undantag inträffade:
1>MSBUILD : fel : Undantag:
1>MSBUILD: fel: Kan inte få en publik nyckel för StrongNameKeyPair.
1>MSBUILD : fel : StackTrace:
1>MSBUILD: fel: vid System.Reflection.StrongShapeNameKeyPair.ComputePublicKey()
1>MSBUILD: fel: i System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: fel: i Mono.Cecil.ModuleWriter.WriteModuleTo(ModuleDefinition-modul, Disposable'1-ström, WriterParameters-parametrar)
1>MSBUILD: fel: i Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters)
1>MSBUILD: fel: I InnerWeaver.WriteModule() position C:\projects\fody\FodyIsolated\ModuleWriter.cs: radnummer 18
1>MSBUILD: fel: I InnerWeaver.Execute() position C:\projects\fody\FodyIsolated\InnerWeaver.cs: radnummer 86
1>MSBUILD : fel : Källa:
1>MSBUILD : fel : mscorlib
1>MSBUILD : fel : TargetSite:
1>MSBUILD : error : Byte[] ComputePublicKey()
1>MSBUILD : fel :
1> Fody: Färdigställde Fody 551 ms.


Det verkar inte finnas någon lösning, se artikeln:

https://github.com/Fody/ExtraConstraints/issues/5

https://github.com/Fody/Costura/issues/194


Lita inte på starka namn för att vara säker.

Så det känns meningslöst att gå den extra milen för att skydda något som inte är en säkerhetsfunktion

 Hyresvärd| Publicerad på 2018-04-17 13:02:12 |
xxhh Publicerad den 2018-4-17 11:35
Efter att ha installerat Costura.Fody direkt i vs NuGet drog jag en Windows Media Playe-spelare för att generera två inbyggda dll:ar att ta bort eller rapportera ...

Windows Media Player-kontroller är com-komponenter, jag vet inte om "Costura.Fody" stöder dem.

1: Du borde kolla om "Costura.Fody" stödjer "com components"
2: Ignorera de två DLL:erna som är paketerade, för hur man ignorerar xml bör ställas in, se den officiella dokumentationen för detaljer
Publicerad på 2018-04-17 10:29:52 |
Ladda ner för att se XML-konfigurationen
Publicerad på 2018-04-17 10:33:34 |
Ägaren vill fråga om jag kan få ihop videon och dll i ett exe-plugin
 Hyresvärd| Publicerad på 2018-04-17 11:16:15 |
xxhh Publicerad den 2018-4-17 10:33
Ägaren vill fråga om jag kan få ihop videon och dll i ett exe-plugin
...

Du kan göra detta, du kan ställa in videoegenskapen till "Embedded Resources" och sedan läsa resursfilen.
Publicerad på 2018-04-17 11:35:51 |
Xiao Zhao publicerade den 2018-4-17 11:16
Du kan göra detta, du kan ställa in videoegenskapen till "Embedded Resources" och sedan läsa resursfilen. ...

Jag drog en Windows Media Playe-spelare direkt efter att ha installerat Costura.Fody i vs NuGet och skapade två inbyggda dll:ar för att ta bort eller rapportera ett fel  
Publicerad på 2018-04-17 11:57:09 |
Behöver XML fortfarande ställas in?     
Publicerad på 2018-04-17 17:42:31 |
Xiao Zhao publicerade den 2018-4-17 11:16
Du kan göra detta, du kan ställa in videoegenskapen till "Embedded Resources" och sedan läsa resursfilen. ...

Hyresvärden eller jag, jag vill fråga, jag lägger in videon i den inbyggda resursen, det som läses ut är en bytearray, finns det något sätt att lägga in den i spelaren och spela upp den direkt (jag vill inte skriva till lokalfilen för att spela i läsbanan, videon är mer än bara det stora kortet)
 Hyresvärd| Publicerad på 2018-04-17 20:52:16 |
xxhh Publicerad den 2018-4-17 17:42
Hyresvärden eller jag, jag vill fråga, jag lägger in videon i den inbäddade resursen, och det som läses upp är en bytearray, finns det något sätt att lägga in den i spelaren och spela upp den direkt ( ...

Det rekommenderas inte att göra en stor video till en resursfil, du kan se om det finns något annat sätt för spelaren att direkt skicka in byte[]
Publicerad på 2018-04-18 08:08:48 |
Xiao Zhazha Publicerad den 2018-4-17 20:52
Det rekommenderas inte att göra en stor video till en resursfil, du kan se om det finns något annat sätt för spelaren att direkt skicka in byte[] ...

Ingen av dem läser videoadresser och vill fråga dig vilka bra idéer du har
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com