2009-03-20 6 views
70

Molte persone qui hanno probabilmente familiarità con uno dei post più famosi del blog Joel Spolsky, Please Sir, May I Have a Linker, dove grida per un modo per rimuovere le dipendenze dal framework .NET in modo che sia possibile sviluppare e vendere un'applicazione stand-alone.Lo stato dei linker per le app .NET (aka "Please Sir, May I have a Linker" edizione 2009)

Jason Zander del team di sviluppo di Visual Studio, al momento, ha risposto with his views on the topic, sostenendo che l'argomento è in qualche modo discutibile - la capacità di correggere i problemi di sicurezza in runtime (tra gli altri punti) era la loro principale preoccupazione. Nel complesso, il piccolo overhead è valsa la pena.

Avanti veloce al 2009. Ci sono alcuni gruppi là fuori che affermano di avere i linker C#. (Jason Zander ha anche detto a se stesso che non ci sarebbe voluto molto per implementarlo.) Invece del simpatico download da decine di mega di .NET 1.0, ora abbiamo un enorme programma di installazione .NET 3.5 completo multipiattaforma da 200-300 mb che contiene versioni di .NET per x86, x64 e ia64. suggerimenti di Microsoft per ridurre le dimensioni di esecuzione sono:

  • Estrarre la ridistribuibile, rimuovere le piattaforme di destinazione che non si desidera, e rimetterlo insieme
  • Utilizzare il programma di avvio automatico web che scarica solo le librerie per la piattaforma
  • Utilizzare il programma di installazione client Profile (nuove a partire dal fine del 2008), che ha limitato le librerie e funziona solo per x86

a peggiorare le cose, se ho capito bene (per favore correggetemi se sbaglio) il cliente il profilo non si registra nemmeno con windows come avendo installato .NET 3.5. Ciò significa che se sul computer sono installate più applicazioni client .NET 3.5, nessuna si vedrà e il runtime verrà reinstallato ancora e ancora!

Non so davvero cosa stia pensando Microsoft. Anche supponendo che l'installazione del caso peggiore sia per una piattaforma di destinazione (ad esempio, x64) e solo quelle librerie devono essere incluse, stai ancora guardando verso l'alto di 60 mb di overhead sulla tua app. Anche una delle applicazioni .NET più conosciute, Paint.NET, era irta di Difficulties installing the application because of the massive .NET dependencies. Se hanno problemi a distribuire un'applicazione gratuita, e il resto del mondo? Alla fine, hanno dovuto Make a bootstrapper that installed Microsoft Installer 3.1, the .NET runtime bootstrapper, and all their other dependent libraires prima di poter installare la propria applicazione.

Quindi che ne dite. Un linker. Esistono cose buone o uno strumento che rende semplicemente possibile creare un'applicazione C# senza richiedere all'utente l'installazione del massivo runtime .NET?

Aggiornamento: così, sembra che ci sono un paio di opzioni:

Mono:

.NET:

Sembra che gli strumenti Mono siano utilizzati; che ne dici degli strumenti basati su .NET? Qualche altra esperienza con loro, o dovremo aspettare che Microsoft lo spinga a tutti? Rabbrividisco a pensare a quanto tempo ci vorrà affinché .NET 4.0 venga messo fuori ...

+0

Non ILMerge dispone di un'opzione che lo fa? – configurator

+0

Sei così giusto !!! Il programma di installazione di un driver della webcam (42M stesso) di Microsoft è andato al Web e ha scaricato .NET 3.0 - ci sono voluti più di 10 minuti su ADSL 1,5 M ... Ciò che mi viene richiesto - Solo per usare una webcam ... –

+0

Sarebbe un peccato se Microsoft non impiegasse tanto tempo a spingere .NET 3.5 verso tutti. Se lo includevano nei service pack più recenti come con .NET 2.0, la maggior parte delle persone non avrebbe dovuto occuparsi di queste assurdità. –

risposta

49

Il caso dello Mono Linker.

Non posso parlare molto degli altri software elencati qui, ma come autore del Mono Linker, posso dire cosa fa e cosa no.

Il Mono Linker è solo un linker gestito, quindi per definizione prende gli assembly e rimuove ciò che non è necessario per l'esecuzione di un programma. Non unisce gli assembly tutti insieme e non ne crea un programma nativo.

C'è un clone Mono.Merge di ILMerge, ma non è completo e il suo autore non lo mantiene. Per generare un programma nativo contenente sia il runtime Mono sia gli assiemi, Mono fornisce lo mkbundle tool.

Inoltre, poiché è solo uno strumento gestito, che sta modificando gli assembly, se gli si assegna un assembly con nome forte e non si dispone delle chiavi private per riconnettersi, si avranno problemi durante l'esecuzione di tali assembly .

ho scritto un paio di post di blog circa il linker:

Circa la nostra esperienza con il Linker. Il Linker è attualmente utilizzato in due parti del progetto Mono. Viene utilizzato per generare l'assembly che distribuiamo affinché le persone incorporino il nostro compilatore C#, Mono.CSharp.dll. Puoi guardare Miguel's presentation al PDC, che descrive come lo facciamo.È piuttosto semplice, ed è un uso basilare del Linker, che è uno strumento personalizzabile, ed è abbastanza facile scrivere passi personalizzati per questo.

Un uso più complesso del Linker è il modo in cui è we create our Moonlight assemblies. Moonlight essendo la nostra implementazione di Silverlight, gli assembly sono un sottoinsieme degli assembly desktop. Quindi colleghiamo i nostri assembly desktop per ridurne le dimensioni e, utilizzando i passaggi personalizzati, trasformiamo l'API pubblica in modo che corrisponda a Silverlight.

Quindi sì, il Linker ha alcuni bordi piuttosto grezzi, come l'interfaccia della riga di comando, per esempio, o il fatto che devi sapere davvero cosa stai facendo, o potresti finire con qualche strano assemblaggio, ma tutto sommato, funziona davvero bene per noi.

+22

+10 per essere cool e scrivere il linker mono :) –

+2

il linker viene anche utilizzato per Monotouch per aggirare il fatto che Apple non permetterà (interpreti byte code) e macchine virtuali di essere installato su l'iphone –

+6

Matthew: beh, non proprio. Il linker viene utilizzato in MonoTouch per ridurre le dimensioni dell'applicazione finale. È il compilatore AOT che elude la limitazione JIT –

2

Questo è il principale che ho sentito molto tempo fa su .NET Rocks. Non ho mai avuto un cambiamento di provarlo se

http://www.remotesoft.com/linker/

+0

sembra morto – Simon

+0

Ho appena provato. Ha funzionato bene per me. –

+0

Link valido. Costo $ 1249. Immagino che sia la .net Tax. Sono contento che siamo andati su web. –

5

FWIW

Mono ha had a linker per un bel po '.

Ecco un example su come utilizzare mkbundle.

+0

È buono come il linker :), ma non risolve il problema specifico qui. Il linker di Mono è gestito, che funziona solo su assiemi gestiti. –

+0

Bene, quindi controlla mkbundle - http: //linux.die.net/man/1/mkbundle. – supercheetah

+0

sambo99, hai avuto qualche esperienza con esso? –

2

mai usato, ma ho sentito che si possono fare cose simili con i registri profilo .NET Reactor

3

client con Windows, ma in modo speciale dal momento che non si vuole confondere una macchina con solo profilo cliente con una macchina con il profilo completo 3.5

client .NET:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\DotNetClient\v3.5\Install 

versione completa di .NET 3.5:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5\Install 
2

ero arguing (under my pen name "Mr Analogy") la necessità di un linker sul forum di Joel per un po 'prima di scrivere quell'articolo. La proliferazione di linker sembra aver giustificato la mia preoccupazione (purtroppo).

http://www.thinstall.com/

da persone con cui ho parlato, è abbastanza ben considerato, anche se ultima volta che ho controllato la licenza era oneroso (2k $/anno per le licenze app). Sembrano rivolti ai negozi IT piuttosto che agli sviluppatori sw. Il fatto che non sia possibile trovare prezzi sul loro sito suggerisce (per me) che è costoso.

5

http://www.xenocode.com/

Questo è quello che usiamo. Finora, dopo un anno o un uso piuttosto limitato (forse 500 installazioni in natura), zero problemi.

Ed è piuttosto a prezzi ragionevoli. Dispongono di un software di virtualizzazione completo più costoso (che raggruppa la tua app con altre app e persino un O/S). Ma non avevamo bisogno di tutto questo. Il nostro costo circa un anno fa era di $ 400. Penso che sia un po 'più costoso ora ma molto meno di Thinstall.

E hanno grandi demo è possibile scaricare, come IE 8. No install required.