Vra

Gebruik jy ILMerge?Gebruik jy ILMerge om saam te smelt verskeie gemeentes te verlig ontplooiing van dll se?Het jy probleme met die ontplooiing/weergawes in produksie na ILMerging gemeentes saam?

Ek is op soek na'n paar advies met betrekking tot die gebruik van ILMerge te verminder ontplooiing wrywing, as dit is selfs moontlik.

Was dit nuttig?

Oplossing

Ek gebruik ILMerge vir byna almal van my ander programme. Ek het dit geïntegreer regs in die vrylating bou proses so wat ek uiteindelik met een exe per aansoek met geen ekstra dll's.

Jy kan nie enige C ++ gemeentes wat inheemse kode het ILMerge. Jy kan ook nie enige gemeentes wat XAML vir WPF bevat (ten minste ek het nie enige sukses met dié het) ILMerge. Dit kla tydens looptyd dat die hulpbronne nie opgespoor kan word.

Ek het skryf 'n wrapper uitvoerbare vir ILMerge waar ek slaag in die startup exe naam vir die projek wat ek wil om saam te smelt, en 'n uitset exe naam, en dan weerspieël dit die afhanklike gemeentes en doen 'n beroep ILMerge met die toepaslike command line parameters. Dit is baie makliker nou as ek nuwe gemeentes te voeg tot die projek, het ek nie om te onthou om die bou script werk.

Ander wenke

Inleiding

Hierdie pos wys hoe om al .exe + .dll files vervang met 'n enkele combined .exe. Dit hou ook die ontfouting .pdb lêer ongeskonde.

Vir Console Programme

Hier is die basiese Post Build String vir Visual Studio 2010 SP1, met behulp van NET 4.0. Ek bou van 'n konsole exe met al die sub-DLL lêers ingesluit in dit.

"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(TargetDir)$(TargetName).all.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards

Basiese wenke

  • Die produksie is 'n lêer "AssemblyName.all.exe" wat al die sub-dlls kombineer in een exe.
  • Let op die ILMerge\ gids. Jy moet óf kopieer die ILMerge nut in jou oplossing directory (sodat jy die bron kan versprei sonder om te bekommer oor die dokumentasie van die installering van ILMerge), of verander die hierdie pad te wys waar ILMerge.exe woon.

Gevorderde wenke

As jy probleme met dit nie werk nie, draai op Output, en kies Show output from: Build. Kyk op die presiese opdrag wat Visual Studio eintlik gegenereer, en kyk vir foute.

Voorbeeld Bou Script

Dit script vervang alle .exe + .dll files met 'n enkele combined .exe. Dit hou ook die ontfouting Pdb ongeskonde te dien.

Om te gebruik, plak dit in jou Post Build stap, onder die blad Build Events in 'n C # projek, en maak seker dat jy die pad in die eerste reël aanpas om te verwys na ILMerge.exe:

rem Create a single .exe that combines the root .exe and all subassemblies.
"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(TargetDir)$(TargetName).all.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards
rem Remove all subassemblies.
del *.dll
rem Remove all .pdb files (except the new, combined pdb we just created).
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).all.pdb.temp"
del *.pdb
ren "$(TargetDir)$(TargetName).all.pdb.temp" "$(TargetName).all.pdb"
rem Delete the original, non-combined .exe.
del "$(TargetDir)$(TargetName).exe"
rem Rename the combined .exe and .pdb to the original project name we started with.
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).pdb"
ren "$(TargetDir)$(TargetName).all.exe" "$(TargetName).exe"
exit 0

Ons gebruik ILMerge op die Microsoft aansoek blokke - in plaas van 12 aparte DLL lêers, ons het 'n enkele lêer wat ons kan oplaai na ons kliënt gebiede, plus die lêerstelsel struktuur is baie netjieser.

Na die samesmelting van die lêers, moes ek die Visual Studio projek lys wysig, verwyder die 12 aparte assmeblies en voeg die enkele lêer as 'n verwysing, anders sou dit kla dat dit kon vind die spesifieke vergadering. Ek is nie so seker hoe dit sou werk op post ontplooiing egter die moeite werd om te gee dit 'n probeer wees.

Ek weet dit is 'n ou vraag, maar ons nie net gebruik ILMerge om die aantal afhanklikes te verminder nie, maar ook om die "interne" afhanklikhede internaliseer (bv automapper, restsharp, ens) wat gebruik word deur die nut. Dit beteken dat hulle heeltemal weg onttrek, en die projek met behulp van die saamgesmelte nut het nie nodig om te weet oor hulle. Dit verminder weer die nodige verwysings in die projek, en dit toelaat om te gebruik / sy eie weergawe van dieselfde eksterne biblioteek indien nodig te werk.

Ons gebruik ILMerge op 'n hele paar projekte. Die Web Service sagteware Factory , byvoorbeeld produseer iets soos 8 gemeentes as sy produksie. Ons saamsmelt al daardie DLLs in 'n enkele DLL sodat die diens gasheer net sal moet een DLL verwys.

Dit maak die lewe 'n bietjie makliker te maak, maar dit is nie 'n big deal nie.

Ons het dieselfde probleem met die kombinasie van WPF afhanklikhede .... ILMerge verskyn nie om te gaan met hierdie. Costura.Fody gewerk perfek vir ons egter en het sowat 5 minute om aan die gang ... 'n baie goeie ervaring.

Net installeer met Nuget (kies die korrekte standaard projek in die pakket Bestuurder Console). Dit stel hom in die teiken projek en die standaard instellings gewerk onmiddellik vir ons.

Dit paart die hele DLLs gemerk "Copy Plaaslike" = true en produseer 'n saamgesmelte EXE (saam met die standaard uitset), wat mooi in grootte (veel minder as die totale uitset grootte) saamgepers.

Die lisensie is MIT as so jy kan verander / versprei as wat nodig is.

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

Let daarop dat vir vensters GUI programme (bv Winforms) jy wil hê dat die / teiken gebruik: winexe skakelaar.
Die / teiken:. exe skakelaar skep 'saamgesmelt konsole aansoek

Ons het in die moeilikheid wanneer die samesmelting DLLs dat hulpbronne in dieselfde naamruimte. In die samesmelting proses een van die hulpbron naamruimtes herdoop en dus die hulpbronne kan nie gevestig word. Miskien is ons net iets verkeerd daar, ondersoek nog die saak.

Ons het net begin gebruik ILMerge in ons oplossings wat herverdeel en gebruik in ons ander projekte en so ver so goed. Alles lyk okay om te werk. Ons verborge selfs die verpak vergadering direk.

Ons oorweeg om dieselfde te doen met die MS Enterprise Biblioteek gemeentes.

Die enigste werklike probleem wat ek sien met dit is weergawes van individuele gemeentes van die pakket.

Ek het onlangs kwessie waar ek vergadering in die gemeente wil ek het 'n paar klasse hierdie is via besinning in Umbraco opensource CMS genoem het ilmerged.

Die inligting op die oproep via weerspieëling maak is geneem uit db tafel daardie naam en naamruimte van klas wat geïmplementeer en koppelvlak vergadering gehad. Die probleem was dat die besinning oproep sou misluk wanneer dll was il egter saamgesmelt as dll was skei dit alles werk goed. Ek dink probleem kan soortgelyk aan die een longeasy wees is om?

Ek is net begin met behulp van ILMerge as deel van my CI bou om te kombineer om'n baie van die fyn grein WCF kontrakte in'n enkele biblioteek.Dit werk baie goed, maar die nuwe saamgesmelt lib kan nie maklik mede-bestaan met sy komponent biblioteke, of ander libs wat afhanklik is van daardie komponent biblioteke.

Indien, in'n nuwe projek, jy verwysing beide jou ILMerged lib en ook'n nalatenskap biblioteek wat afhanklik is van een van die insette wat u gegee het om ILMerge, sal jy vind dat jy kan nie slaag nie enige tipe van die ILMerged lib aan enige metode in die nalatenskap biblioteek sonder om'n soort van die tipe kaart (bv.automapper of handleiding kartering).Dit is omdat wanneer alles is saamgestel, die tipes is effektief gekwalifiseer met'n vergadering naam.

Die name sal ook bots maar jy kan dit regmaak met behulp van eksterne alias.

My raad sou wees om te vermy, insluitend in jou saamgesmelt vergadering enige publiek beskikbaar lib dat jou saamgesmelt vergadering ontbloot (bv.via'n terugkeer tipe, metode/constructor parameter, veld, eiendom, generiese...), tensy jy weet vir seker dat die gebruiker van jou saamgesmelt vergadering nie en nooit sal afhang van die vry-staande weergawe van die dieselfde biblioteek.

Dit lyk vir my soos die # 1 ILMerge Best Practice is gebruik nie ILMerge. In plaas daarvan, gebruik SmartAssembly . Een van die redes hiervoor is dat die # 2 ILMerge Best Practice is om altyd uit te voer PEVerify nadat jy 'n ILMerge doen, want ILMerge waarborg nie dit sal korrek gemeentes om saam te smelt in 'n geldige uitvoerbare.

Ander ILMerge nadele:

  • wanneer die samesmelting, dit stroop XML Comments (as ek omgegee het, sou ek 'n obfuscation instrument te gebruik)
  • dit nie korrek hanteer skep van 'n ooreenstemmende Pdb lêer

Nog 'n instrument ter waarde van aandag te skenk aan is Mono.Cecil en die Mono.Linker [2] hulpmiddel.

[2]: http: // www.mono-project.com/Linker

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top