ILMerge Best Practices




Používáte ILMerge? Používáte ILMerge sloučit více sestav pro usnadnění nasazení DLL? Našli jste problémy se nasazení / verzí ve výrobě po ILMerging sestav dohromady?


Sháním nějakou radu v souvislosti s pomocí ILMerge snížit nasazení tření, je-li to vůbec možné.
Používám ILMerge pro téměř všechny své různých aplikací. Mám ji integrovat přímo do procesu sestavení uvolnění, takže to, co jsem skončit s jedním exe jednu aplikaci s žádné další DLL. 


Nemůžete ILMerge žádnou C ++ sestavy, které mají nativní kód. Také nelze ILMerge jakýchkoli dílů, které obsahují XAML pro WPF (alespoň jsem neměl žádný úspěch s tím). Stěžuje za běhu, že prostředky nelze nalézt.


Udělal jsem napsat obálky spustitelný ILMerge kde jsem se projít ve spouštěcím názvu exe pro projekt chci sloučit, a výstupní název exe, a pak to odráží závislých sestavy a volání ILMerge s příslušnými parametry příkazového řádku. Je to mnohem jednodušší, teď, když jsem přidat nové sestavy projektu, nemám na paměti, aktualizovat build skriptu.
V tom pripade doporucuji si rozsirit obzory o mediaservery jako je Plex, Ebmy, Jellyfin (fork Emby, bez platby za premium funkce). Pak nejspis sam uznas ze DLNA je opravdu hodne jednoduche a omezene reseni. <p>nejobsáhlejší software pro testování zátěže, který jsem našel, je <a href="http://bit.ly/4r8g2l">hp loadrunner</a> (omlouvám se za bit.ly odkaz, ale hp odkaz je hrozný a nebude fungovat správně). je velmi flexibilní a ze zátěžových testů můžete generovat mnoho různých typů zpráv. můžete také nechat skupinu strojů pracovat společně s testem zatížení. ne, že ostatní nástroje jsou špatné, ale vypadá to jako <a href="http://jakarta.apache.org/jmeter/">apache jmeter</a> vypadá jako hračka.</p> <p>příkaz <code>merge</code> má složitou syntaxi a ještě složitější implementaci, ale v zásadě jde o spojení dvou tabulek, filtrování dolů na řádky, které je třeba změnit (vložit, aktualizovat nebo smazat), a poté provést požadované změny. vzhledem k těmto vzorovým údajům:</p><pre><code>declare @categoryitem as table ( categoryid integer not null, itemid integer not null, primary key (categoryid, itemid), unique (itemid, categoryid) ); declare @datasource as table ( categoryid integer not null, itemid integer not null primary key (categoryid, itemid) ); insert @categoryitem (categoryid, itemid) values (1, 1), (1, 2), (1, 3), (2, 1), (2, 3), (3, 5), (3, 6), (4, 5); insert @datasource (categoryid, itemid) values (2, 2); </code></pre><p><strong> cíl </strong></p><pre><code>╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 1 ║ 1 ║ ║ 2 ║ 1 ║ ║ 1 ║ 2 ║ ║ 1 ║ 3 ║ ║ 2 ║ 3 ║ ║ 3 ║ 5 ║ ║ 4 ║ 5 ║ ║ 3 ║ 6 ║ ╚════════════╩════════╝ </code></pre><p><strong> zdroj </strong></p><pre><code>╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 2 ║ 2 ║ ╚════════════╩════════╝ </code></pre><p>požadovaným výsledkem je nahrazení dat v cíli daty ze zdroje, ale pouze pro <code>categoryid = 2</code>. po výše uvedeném popisu <code>merge</code> bychom měli napsat dotaz, který spojuje zdroj a cíl pouze na klíče, a filtrovat řádky pouze v klauzulích <code>when</code>:</p><pre><code>merge into @categoryitem as target using @datasource as source on source.itemid = target.itemid and source.categoryid = target.categoryid when not matched by source and target.categoryid = 2 then delete when not matched by target and source.categoryid = 2 then insert (categoryid, itemid) values (categoryid, itemid) output $action, isnull(inserted.categoryid, deleted.categoryid) as categoryid, isnull(inserted.itemid, deleted.itemid) as itemid ; </code></pre><p>to dává následující výsledky:</p><pre><code>╔═════════╦════════════╦════════╗ ║ $action ║ categoryid ║ itemid ║ ╠═════════╬════════════╬════════╣ ║ delete ║ 2 ║ 1 ║ ║ insert ║ 2 ║ 2 ║ ║ delete ║ 2 ║ 3 ║ ╚═════════╩════════════╩════════╝ ╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 1 ║ 1 ║ ║ 1 ║ 2 ║ ║ 1 ║ 3 ║ ║ 2 ║ 2 ║ ║ 3 ║ 5 ║ ║ 3 ║ 6 ║ ║ 4 ║ 5 ║ ╚════════════╩════════╝ </code></pre><p>realizační plán je: <img src="https://i.stack.imgur.com/fovhu.jpg" alt="merge plan"></p><p>všimněte si, že jsou obě tabulky plně naskenovány. můžeme to považovat za neefektivní, protože pouze řádky, kde <code>categoryid = 2</code> bude ovlivněno v cílové tabulce. zde přicházejí varování v books online. jeden chybný pokus o optimalizaci, aby se dotkl pouze nezbytných řádků v cíli, je:</p><pre><code>merge into @categoryitem as target using ( select categoryid, itemid from @datasource as ds where categoryid = 2 ) as source on source.itemid = target.itemid and target.categoryid = 2 when not matched by target then insert (categoryid, itemid) values (categoryid, itemid) when not matched by source then delete output $action, isnull(inserted.categoryid, deleted.categoryid) as categoryid, isnull(inserted.itemid, deleted.itemid) as itemid ; </code></pre><p>logika v klauzuli <code>on</code> je použita jako součást spojení. v tomto případě je spojení úplným vnějším spojením (viz <a href="http://technet.microsoft.com/en-us/library/bb522522%28v=sql.105%29.aspx">tento záznam books online</a> proč). použití kontroly kategorie 2 na cílových řádcích jako součásti vnějšího spojení nakonec povede k odstranění řádků s jinou hodnotou (protože neodpovídají zdroji):</p><pre><code>╔═════════╦════════════╦════════╗ ║ $action ║ categoryid ║ itemid ║ ╠═════════╬════════════╬════════╣ ║ delete ║ 1 ║ 1 ║ ║ delete ║ 1 ║ 2 ║ ║ delete ║ 1 ║ 3 ║ ║ delete ║ 2 ║ 1 ║ ║ insert ║ 2 ║ 2 ║ ║ delete ║ 2 ║ 3 ║ ║ delete ║ 3 ║ 5 ║ ║ delete ║ 3 ║ 6 ║ ║ delete ║ 4 ║ 5 ║ ╚═════════╩════════════╩════════╝ ╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 2 ║ 2 ║ ╚════════════╩════════╝ </code></pre><p>kořenová příčina je ze stejného důvodu, proč se predikáty chovají v klauzuli vnější spojení <code>on</code> odlišně, než když jsou specifikovány v klauzuli <code>where</code>. syntaxe <code>merge</code> (a implementace spojení v závislosti na zadaných klauzulích) jen ztěžují vidět, že tomu tak je.</p><p> <a href="http://technet.microsoft.com/en-us/library/bb510625%28v=sql.105%29.aspx">navádění v books online</a> (rozšířeno v položce <a href="http://technet.microsoft.com/en-us/library/cc879317%28v=sql.105%29.aspx">optimizing performance</a> ) nabízí navádění, které zajistí, že správná sémantika je vyjádřena pomocí syntaxe <code>merge</code>, aniž by uživatel nutně musel muset pochopit všechny podrobnosti implementace nebo zohlednit způsoby, kterými by optimalizátor mohl legitimně přeskupit věci z důvodů efektivnosti provádění.</p><p>dokumentace nabízí tři možné způsoby implementace časného filtrování:</p><p><strong> zadání podmínky filtrování v klauzuli <code>when</code> </strong> zaručuje správné výsledky, ale může znamenat, že více řádků je čteno a zpracováno ze zdroje a cíle tabulky, než je nezbytně nutné (viz první příklad).</p><p><strong> aktualizace prostřednictvím zobrazení </strong>, která obsahuje podmínku filtrování, také zaručuje správné výsledky (protože změněné řádky musí být přístupné pro aktualizaci prostřednictvím zobrazení), ale vyžaduje to vyhrazené zobrazení, které splňuje liché podmínky pro aktualizaci zobrazení.</p><p><strong> použití společného výrazu tabulky </strong> přináší podobné riziko při přidávání predikátů k klauzuli <code>on</code>, ale z poněkud odlišných důvodů. v mnoha případech to bude bezpečné, ale vyžaduje to odbornou analýzu prováděcího plánu, aby se to potvrdilo (a rozsáhlé praktické testování). například:</p><pre><code>with target as ( select * from @categoryitem where categoryid = 2 ) merge into target using ( select categoryid, itemid from @datasource where categoryid = 2 ) as source on source.itemid = target.itemid and source.categoryid = target.categoryid when not matched by target then insert (categoryid, itemid) values (categoryid, itemid) when not matched by source then delete output $action, isnull(inserted.categoryid, deleted.categoryid) as categoryid, isnull(inserted.itemid, deleted.itemid) as itemid ; </code></pre><p>výsledkem jsou správné výsledky (neopakované) s optimálnějším plánem:</p><p><img src="https://i.stack.imgur.com/tazmk.jpg" alt="merge plan 2"></p><p>plán čte pouze řádky pro kategorii 2 z cílové tabulky. to může být důležitým hlediskem výkonu, pokud je cílová tabulka velká, ale je příliš snadné tuto chybu získat pomocí syntaxe <code>merge</code>.</p><p>někdy je snazší zapsat <code>merge</code> jako samostatné operace dml. tento přístup může dokonce <strong> vést lépe </strong> než jediný <code>merge</code>, což je skutečnost, která lidi často překvapuje.</p><pre><code>delete ci from @categoryitem as ci where ci.categoryid = 2 and not exists ( select 1 from @datasource as ds where ds.itemid = ci.itemid and ds.categoryid = ci.categoryid ); insert @categoryitem select ds.categoryid, ds.itemid from @datasource as ds where ds.categoryid = 2; </code></pre> Oba umí vesměs to samé, ale já mám radši SLES, zdá se mi přívětivější. Oba si taky můžeš zadarmo stáhnout na vyzkoušení. <p>po vykopání jsem zjistil, že drupal dodává hotový pojmenovaný nástroj pro můj přesný případ použití:</p><p><em> vložte řádek do db nebo aktualizujte existující, pokud již existuje. </em></p><p>tomu se říká <a href="http://drupal.org/node/310085">slučovací dotazy</a> , což lze u některých db motorů provést atomově.</p><p>syntext je celkem jednoduchý:</p><pre><code>db\_merge('example') -&gt;key(array('name' =&gt; $name)) -&gt;fields(array( 'field1' =&gt; $value1, 'field2' =&gt; $value2, )) -&gt;execute(); </code></pre> Zkus registry procesorů, nebo velmi osvědčeným tématem jsou přerušení. Pozor nato desky s cipsetem intel nepodporuji grafiky do sli jen deska s cipsetem x58, ale to je deska na intel 7 nebo jak jse to menuje. desky s cipsetem n-force ale ty moc nedoporucuji Tezko rict, ale primo s NTLDR to souvislost nema.  
  
Celkova rozklizenost systemu muze mit ruzne priciny:  
- malware (viry, spyware,...)  
- extremni uzivatelske akce (obvykle s pouzitim uctu s opravnenimi spravce)  
- HW zavada (disk, RAM, MB,...). Neznam zmineny adapter, ale urcite bych NEdoporucil nic co pouziva software BlueSoleil. Dodava se ve verzi 2.x, ktery mi nefungoval prilis spolehlive. Na strankach vyrobce je mozne stahnout pouze verzi 6.x, ale ta je placena. Soucasti toho softu jsou i ovladace. Prikladem muze byt toto www.alza.cz ...   
Berte to jen jako muj osobni nazor, treba se ozve nekdo spokojeny ;) zkusil bych pc/zesilovač/reproduktory zapojit do jiné zásuvky (nebo každý jinam)  
taky zkusit přemístit repráky..