Vraag:
Software voor het bundelen van .NET-assembly's in één assembly
allquixotic
2014-02-05 04:16:42 UTC
view on stackexchange narkive permalink

Stel dat ik een .NET / CLR-programma Hello.exe heb (of een DLL Hello.dll ) dat afhankelijk is van verschillende .NET DLL's van derden. Ik wil een enkel bestand verzenden, zonder een echt "installatieprogramma" op te geven, dus ik ben op zoek naar software die alle afhankelijkheden in het uitvoerbare bestand kan inpakken en ze vervolgens kan laden voordat een van mijn code begint te draaien.

Ik heb het ook nodig om elke geleverde DLL onvoorwaardelijk te laden, niet alleen "op aanvraag", omdat sommige typen in de DLL's toegankelijk zijn via reflectie en dus zal de klassenlader nooit proberen om de DLL expliciet te laden en noem dus de class loader hook. Ik wil geen code aan mijn uitvoerbare bestand hoeven toe te voegen als het mogelijk is om dit te doen zonder mijn eigen code.

Ik gebruik SharpDevelop en .NET Framework 4.0 Full Profile, maar de ideale oplossing voor dit probleem zal IDE-agnostisch zijn en werken met .NET 3.0 of hoger (2.0 zou zelfs beter zijn, maar laten we niet hebzuchtig worden ...)

Je zou de assembly's in een enkel bestand kunnen inpakken en ze dan, bij het laden van de applicatie, naar een tijdelijke map kunnen gooien om ze eventueel te laden en dan `Assembly.LoadFrom` gebruiken om het eigenlijke werk te doen?
Worden deze DLL's van derden beheerd of zijn ze native? Moet u ook .NET-framework inpakken, d.w.z. uw app draaien zonder .NET te installeren?
Nee, ik hoef de app niet uit te voeren zonder .NET Framework geïnstalleerd. De DLL's van derden zijn meestal pure .NET-assembly's, maar sommige zijn native.
Drie antwoorden:
#1
+8
BatteryBackupUnit
2014-06-19 11:19:05 UTC
view on stackexchange narkive permalink

Hoe zit het met ILMerge? Het bestaat al een hele tijd en er zijn veel bronnen. Hier is bijvoorbeeld een korte inleiding. Ook stackoverflow-vragen hebben al enkele veelvoorkomende valkuilen behandeld, zoals DLL samenvoegen met EXE.

Het is ook onafhankelijk van uw bouwomgeving. Je hoeft het alleen maar in je bouwproces in te bedden.

ILMerge is helaas niet perfect. Het ondersteunt bijvoorbeeld het samenvoegen van WPF-assembly's niet. Het alternatief is om de bibliotheken in te bedden als bronnen en ze dynamisch te laden. Zie bijvoorbeeld deze blogpost. De LibZ Container die allquixotic noemde, doet dat in feite.

Voor de LibZ-container is er nog een alternatief, een die wordt geprobeerd en ik zou serieus nadenken: Fody.Costura

Mono mkbundle is misschien nog een ander alternatief, houd er echter rekening mee dat het native code produceert. Afhankelijkheden kunnen statisch worden gekoppeld. Op Windows vereist het ook cygwin om te kunnen draaien (zie ook deze forumthread)

#2
+5
allquixotic
2014-02-05 04:55:11 UTC
view on stackexchange narkive permalink

LibZ Container voorziet uw hoofdassemblage van code die gezipte assembly-bronnen uit het bronbestand uitpakt en uit het geheugen laadt. Het beweert zowel met reflectiecode als met sterke namen te werken, en het verandert de originele assembly-bestanden op geen enkele manier, dus referenties met een sterke naam werken prima.

Kun je wat meer vertellen over deze tool? Een persoonlijke ervaring toevoegen aan uw aanbeveling? Is het gemakkelijk te configureren / gebruiken? Misschien een voorbeeld toevoegen?
#3
  0
allquixotic
2014-02-05 04:53:41 UTC
view on stackexchange narkive permalink

il-repack voldoet gedeeltelijk aan de criteria van het antwoord, maar helaas worden de vergaderingen opnieuw verpakt, waardoor hun sterke naam wordt verbroken, dus als je afhankelijk bent van vergaderingen die met een sterke naam zijn ondertekend, heeft dit gewonnen het werkt niet. Het werkt ook niet met de meeste reflectiecode totdat de assembly's klassikaal zijn geladen.

Kun je wat meer vertellen over deze tool? Een persoonlijke ervaring toevoegen aan uw aanbeveling? Is het gemakkelijk te configureren / gebruiken? Misschien een voorbeeld toevoegen?


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...