Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 219600|Răspunde: 43

[WinForm] .net/c# Folosește Costura.Fody pentru a împacheta DLL-ul în EXE

[Copiază linkul]
Postat pe 14.04.2018 14:41:49 | | | |
Dezvoltarea Winform/wpf se referă inevitabil la multe DLL-uri terțe, dar de fiecare dată când le împachetezi, trebuie să copiezi fișierele din directorul Debug către client sau să le distribui, ceea ce nu este foarte convenabil de folosit. Am încercat mai multe programe pentru a fuziona fișierele dll înainte, cum ar fi ILMerge, Enigma Virtual Box etc., dar până am aflat despre "Costura.Fody", simțeam că lumea era mult mai bună~

Următorul este un program scris de Winform, care face referire la cele două DLL-uri "HttpHelper.dll" și "Newtonsoft.Json.dll", când generăm programul, va exista un fișier exe și aceste două fișiere DLL, ceea ce îi face pe oameni să se simtă foarte inconfortabil, iar dacă există un DLL mai puțin, programul poate raporta o excepție, așa cum se arată în figura de mai jos:



Linkul de mai jos arată utilizarea anterioară (nu este recomandat)

C# împachetează dll în programul exe-ului
http://www.itsvse.com/thread-2841-1-1.html
(Sursa: Architect_Programmer)



Folosind instrumentul Costura.Fody, poți combina DLL-ul sursă în EXE țintă

Pagina principală a proiectului: https://github.com/Fody/Costura

Cum să folosești și să instalezi direct pachetul Nuget:



Odată ce ai adăugat cu succes Costura.Fody, soluția va adăuga automat FodyWeavers.xml fișier.

Regenerează soluția, poți vedea succesul în directorul de generare a programului, toate DLL-urile sunt perfect îmbinate în exe, poți copia direct fișierul exe pe client pentru a rula independent. Așa cum se arată mai jos:

1>------ Toate reconstrucțiile au fost începute: Proiect: itsvse, Configurare: Depanare Orice CPU ------
1> Fody: Fody (versiunea 2.0.0.0) Executare
1> Fody/Costura: Nu s-a găsit nicio referință la "Costura.dll". Referințe nemodificate.
1> Fody/Costura: Încorporarea 'E:\proiect\itsvse\itsvse\HttpHelper.dll'
1> Fody/Costura: Încorporarea 'E:\proiect\itsvse\itsvse\Newtonsoft.Json.dll'
1> Fody: A terminat Fody 609ms.
1> Fody: Am sărit peste asamblarea verificării deoarece este dezactivată în configurație
1> Fody: Verificarea a fost finalizată în 3ms.
1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe
========== Regenerează toate: 1 reușește, 0 eșuează și 0 ========== sărite





După cum se poate vedea din imaginea de mai sus, fișierul generat nu conține Newtonsoft.Json.dll, HttpHelper.dll și Costura.dll nu sunt generate, ci doar două fișiere, itsvse.exe pot fi rulate direct fără erori! (Fișierul PDB poate fi șters).

Să folosim instrumentul ILSpy pentru a decompila programul nostru și să aruncăm o privire la codul sursă generat, așa cum este arătat în figura de mai jos:



Introducere în principiul implementării

Când CLR încearcă să încarce o asamblare, dar nu reușește, generează evenimentul AppDomain.AssemblyResolve. Programul nostru poate asculta acest eveniment și poate returna asamblarea pe care CLR-ul încearcă să o încarce în handler-ul de evenimente, astfel încât programul să poată continua să funcționeze normal.

Fody.Costura încorporează toate DLL-urile referențiate de EXE în fișierul EXE atunci când construiește proiectul. Când un program folosește una dintre aceste DLL-uri în timpul execuției (evenimentul AppDomain.AssemblyResolve este declanșat deoarece CLR-ul nu poate găsi fișierul DLL), DLL-ul necesar este extras din resursele încorporate ale fișierului EXE.


Poți vedea că metoda Attach ascultă evenimentul AppDomain.AssemblyResolve. Când CLR-ul nu reușește să încarce cu succes un ansamblu, handler-ul de evenimente AssemblyResolve este executat. AssemblyResolve încearcă să obțină asamblarea țintă din resursa încorporată a ansamblului încărcat prin metoda Common.ReadFromEmbeddedResources și o returnează către CLR.

Văzând asta, poate vă întrebați, când a fost implementată metoda Attach?

De fapt, pentru limbajul C#, CLR ascunde un truc important – poate executa un cod inițializat înainte ca fiecare modul (fiecare ansamblu conține unul sau mai multe module) să fie încărcat. Din păcate, limbajul C# nu are control asupra acestei părți a codului. Fody.Costura injectează cod IL direct în funcția de inițializare a modulului intern al ansamblului EXE, iar această parte a codului IL execută efectiv metoda Attach. Astfel, odată ce ansamblul EXE este încărcat, metoda Attach poate fi apelată imediat.

Mai sus este o scurtă introducere a principiului de implementare al Fody.Costura.


Configurație avansată

Aceste configurații sunt adăugate sau modificate în CosturaFodyWeavers.xml fișiere.

CreeazăAsamblări Temporare
Implicit: fals
Aceasta încorporează fișierul încorporat pe disc înainte de a-l încărca în memorie. Acest lucru este util pentru anumite scenarii în care vrei să încarci un ansamblu dintr-un fișier fizic.

IncludeDebugSymbols
Implicit: adevărat
Controlează dacă .pdb-urile ansamblului de referință sunt de asemenea încorporate.

DisableCompression
Implicit: fals
Ansamblurile încorporate sunt comprimate implicit și decomprimate când sunt încărcate. Poți dezactiva compresia folosind această opțiune.
Notă: Asigurați-vă că dezactivați această proprietate atunci când faceți referire la DLL-uri non-standard sau DLL-uri criptate. Altfel, va duce la situația în care exe-ul nu poate fi deschis. Acest lucru a fost descoperit când foloseam DSkin.dll.

DisableCleanup
Implicit: fals
Ca parte a Costura, componentele încorporate nu mai sunt incluse în construcție. Această curățare poate fi oprită.

LoadAtModuleInit
Implicit: adevărat
Costura este încărcat implicit ca parte a inițializării modulului. Steagul dezactivează comportamentul. Asigură-te că poți folosi undeva CosturaUtility.Initialize().

ExcludeAssemblies
Cum să folosești: ExcludeAssemblies="DLL1| DLL2"
O listă de nume de asamblare de exclus din acțiunea implicită "încorporează toate referințele locale copiate".

IncludeAssemblies
Cum să folosești: IncludeAssemblies="DLL1| DLL2"
O listă de nume de asamblare incluse în acțiunea implicită Embedding All Copy Local References.

Negestionat32Adunări&Negestionat64Adunări
Cum să-l folosești: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2"
Ansamblurile mixte nu pot fi încărcate în același mod ca și asamblările gestionate. Prin urmare, pentru a ajuta Costura să identifice care componente sunt în modul mixt și în ce medii să le încarce, numele lor ar trebui incluse în una sau ambele liste. Nu include .exe sau .dll în nume.

PreloadOrder
Utilizare: PreloadOrder="DLL1| DLL2"
Bibliotecile locale pot fi încărcate automat de Costura. Pentru a include o bibliotecă locală, include-o în proiectul tău ca o resursă încorporată numită folder costura32 sau costura64, în funcție de instabilitatea bibliotecii. Alternativ, poți specifica ordinea de încărcare în care sunt încărcate bibliotecile preîncărcate. Când amesteci componente temporare de pe disc, acestea sunt și ele preîncărcate.

CosturaUtility
Cum să folosești:




CosturaUtility este o clasă care îți permite să inițializezi manual sistemul Costura în propriul tău cod.Aceasta este în principal pentru scenarii în care programul de inițializare a modulului nu funcționează, cum ar fi bibliotecile și Mono.


În final, descarcă codul sursă din text:

Turiști, dacă vreți să vedeți conținutul ascuns al acestei postări, vă rogRăspunde





Precedent:Soluție StreamReader pentru caractere distorsionate la citirea fișierelor
Următor:Soluții pentru conflictele dintre Hyper-V, VirtualBox și VMware
Postat pe 07.06.2018 09:35:19 |
Încearcă această metodă de integrare a componentei de dependență Dll în Exe compilat C#!

Dacă este ușor de folosit, nu uita să-l lauzi! Haha, asta, adaugă Dll în fișierul de resurse, simplu și practic! (Nu înțeleg, pot să găsesc un tutorial) @小渣渣

 Proprietarul| Postat pe 06.06.2018 10:30:42 |
Dacă semnați un program, veți primi următoarea eroare:

1>MSBUILD : erori : Fody: A apărut o excepție negestionată:
1>MSBUILD : eroare : Excepție:
1>MSBUILD: eroare: Nu se poate obține o cheie publică pentru StrongNameKeyPair.
1>MSBUILD : eroare : StackTrace:
1>MSBUILD: eroare: la System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: eroare: în System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: eroare: în Mono.Cecil.ModuleWriter.WriteModuleTo(ModuleDefinition module, fluxul Disposable'1, parametrii WriterParameters)
1>MSBUILD: eroare: în Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters parametri)
1>MSBUILD: eroare: În poziția InnerWeaver.WriteModule() C:\projects\fody\FodyIsolated\ModuleWriter.cs: linia numărul 18
1>MSBUILD: eroare: În InnerWeaver.Execute() poziția C:\projects\fody\FodyIsolated\InnerWeaver.cs: numărul liniei 86
1>MSBUILD : eroare : Sursa:
1>MSBUILD : eroare : mscorlib
1>MSBUILD : eroare : TargetSite:
1>MSBUILD : eroare : Byte[] ComputePublicKey()
1>MSBUILD : eroare :
1> Fody: A terminat Fody 551ms.


Se pare că nu există o soluție, vezi articolul:

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

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


Nu te baza pe nume puternice ca să fii în siguranță.

Deci pare inutil să mergem mai departe pentru a proteja ceva ce nu este o caracteristică de securitate

 Proprietarul| Postat pe 17.04.2018 13:02:12 |
xxhh Postat la 2018-4-17 11:35
După ce am instalat Costura.Fody direct în loc de NuGet, am tras un player Windows Media Playe pentru a genera două DLL-uri încorporate pe care să le șterg sau să raportez ...

Controalele Windows Media Player sunt componente de comunicare, nu știu dacă "Costura.Fody" le suportă.

1: Ar trebui să vezi dacă "Costura.Fody" suportă "com components"
2: Ignorați cele două DLL-uri care sunt ambalate, deoarece modul de a ignora xml-ul trebuie setate, vă rugăm să consultați documentația oficială pentru detalii
Postat pe 17.04.2018 10:29:52 |
Descarcă pentru a vedea configurația XML
Postat pe 17.04.2018 10:33:34 |
Proprietarul vrea să te întrebe dacă pot să pun videoclipul și să-l transform într-un plugin exe
 Proprietarul| Postat pe 17.04.2018 11:16:15 |
xxhh Postat pe 2018-4-17 10:33
Proprietarul vrea să te întrebe dacă pot să pun videoclipul și să-l transform într-un plugin exe
...

Poți face asta, poți seta proprietatea video pe "Resurse Încorporate" și apoi să citești fișierul de resurse.
Postat pe 17.04.2018 11:35:51 |
Xiao Zhao a postat la 2018-4-17 11:16
Poți face asta, poți seta proprietatea video pe "Resurse Încorporate" și apoi să citești fișierul de resurse. ...

Am tras un player Windows Media Playe imediat după ce am instalat Costura.Fody în vs NuGet și am produs două DLL-uri integrate pentru a șterge sau raporta o eroare  
Postat pe 17.04.2018 11:57:09 |
Trebuie încă setat XML?     
Postat pe 17.04.2018 17:42:31 |
Xiao Zhao a postat la 2018-4-17 11:16
Poți face asta, poți seta proprietatea video pe "Resurse Încorporate" și apoi să citești fișierul de resurse. ...

Proprietarul sau eu, vreau să întreb, am pus videoclipul în resursa încorporată, ceea ce se citește este un tablou de octeți, există vreo modalitate de a-l pune în player și de a-l reda direct (nu vreau să scriu pe localul pentru a reda în ruta de citire, videoclipul este mai mult decât cardul mare)
 Proprietarul| Postat pe 17.04.2018 20:52:16 |
xxhh Postat la 2018-4-17 17:42
Proprietarul sau eu, vreau să întreb, am pus videoclipul în resursa încorporată, iar ceea ce se citește este un array de octeți, există vreo modalitate de a-l pune în player și de a-l reda direct ( ...

Nu este recomandat să transformi un video mare într-un fișier de resurse, poți vedea dacă există vreo altă modalitate prin care playerul să treacă direct în byte[]
Postat pe 18.04.2018 08:08:48 |
Xiao Zhazha Postat la 2018-4-17 20:52
Nu este recomandat să transformi un videoclip mare într-un fișier de resurse, poți vedea dacă există vreo altă modalitate prin care playerul să treacă direct în byte[] ...

Niciunul dintre ei nu citește adrese video și vrea să te întrebe ce idei bune ai
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com