2009-09-05 9 views
15

Qual è il migliore in termini di funzionalità, facilità d'uso, documentazione, esempi, community/supporto, integrazione VS, implementazioni note, redditività a lungo termine e costruire velocità per implementare un framework AOP personalizzato?Mono Cecil vs. PostSharp Core vs Microsoft CCI per l'implementazione del framework AOP

inizierò con quello che so (ho provato solo PostSharp a finora):

  • Microsoft Common Compiler Instrastruture (CCI): Ho letto che viene utilizzato per FxCop , ILMerge, SpeC# e Contratti di codice. Sembra essere molto basso livello as it does not even take care of correcting offsets for branch codes that are borken when IL is modified with it.
  • PostSharp è di 5 anni, ha molte capacità per AOP (ad esempio estratti alcune cose che avrebbe bisogno di avere a fare manualmente con IL distanza), il codice sorgente disponibili, sviluppato/supportato da solo un ragazzo ma lui sta progettando di rendere questo un business, ha documentazione ma potrebbe essere migliore, costruisce prendere circa il doppio del tempo, molto piccoli campioni su come iniettare iL e la versione 2.0 sarà rilasciata presto che promette di essere molto più migliorata.
  • Mono Cecil: Scritto da un ragazzo, parte della suite Mono e v'è un plug-in per Reflector chiamati Reflexil che utilizza Mono Cecil.

risposta

6

Sia Microsoft.CCI che Mono.Cecil sono di basso livello e non convalidano gli assembly prodotti. Ci vuole un sacco di tempo per trovare la ragione del problema, se c'è qualche errore nel codice generato o nella struttura dell'assieme.
Si consiglia di utilizzare PostSharp se le funzionalità sono sufficienti per le attività.
In caso contrario ... Mono.Cecil ha un modello di oggetto migliore, più comprensibile e facile da usare. Tuttavia, ho avuto un brutto bug quando l'ho usato nel mio programma (il riferimento al metodo sbagliato è stato salvato nell'assembly, penso che ci sia stato un errore nella gestione dei token di metadati)
Microsoft.CCI ha un oggetto bruttino, completamente sovradimensionato modello nello stesso tempo privo di molte caratteristiche semplici; tuttavia, è più maturo di Mono.Cecil. Infine, ho abbandonato Mono.Cecil e ho utilizzato Microsoft.CCI per il mio programma.

+0

Grazie per aver condiviso le tue esperienze! Penso che tu possa sempre usare PEVerify Tool per convalidare i tuoi assembly prodotti. Sto usando PostSharp in questo momento e sono stato in grado di fare tutto ciò che volevo con esso finora (e hai ragione nel trovare il motivo, può essere molto frustrante ...). Cosa intendi per più maturo? Meno buggy? C'è una ragione particolare per cui non utilizzi PostSharp? Per curiosità, cosa sta facendo il tuo programma? –

+0

Il mio programma è assembly merger/shrinker, quindi PostSharp non mi è stato d'aiuto. E sì, ho trovato MicrosoftCCI meno bug e supporta più funzionalità CLI (assembly misti, per esempio). Tuttavia, il suo modello a oggetti è davvero difficile da usare. Ho usato PEVerify per controllare gli assembly generati (e non sono sicuro di poterlo fare a meno senza :)) Tuttavia, gli errori spesso interrompono il processo di generazione degli assiemi e PEVerify è inutile in questi casi. – skevar7

4

Come con la maggior parte dei quadri che sono già là fuori, vorrei suggerire a voi, per quanto riguarda l'implementazione del proprio framework AOP: Non farlo. Ne esistono già diversi, tra cui (prossimamente) PostSharp commercialmente supportato e CThru, un framework AOP basato su Typemock.

Ma comunque, ho trovato Mono.Cecil molto facile da usare. Elimina la necessità di gestire lo Reflection.Emit in modo appropriato e ha il supporto della comunità Mono.

Suggerisco di dare un'occhiata a LinFu - è un set di librerie open-source, uno di loro è un framework AOP implementato su Mono.Cecil. C'è un bell'articolo su LinFu AOP su CodeProject.

+0

Mi interessa solo AOP che inietta il codice durante la compilazione. –

+0

LinFu lo fa. Ha un compito post-compilatore per tessere l'IL. –

+1

Mentre LinFu.AOP tesse IL che modifica i tipi per abilitare l'iniezione di codice con un'attività di post-compilatore, il codice effettivo viene iniettato durante l'esecuzione che è meno performante. –

3

AFAIK, LinFu è costruito su Mono.Cecil.

Direi che PostSharp.Il core ha più funzioni di alto livello rispetto ad altri framework, quindi è meno difficile da utilizzare per i lavori più grandi. Puoi lavorare anche a basso livello, ma non a livello binario (in base alla progettazione). Si potrebbe fare un assemblaggio di un merger/shrinker usando PostSharp, ma il fatto che ricompaia usando ILASM imposterà alcune limitazioni (ad esempio che dovrebbero essere nominati anche i membri interni). D'altra parte, avere ILASM come backend rende molto più facile lo sviluppo di PostSharp, dal momento che ILASM verifica molte regole e si può facilmente leggere il codice MSIL prodotto. PostSharp ti consente persino di inserire commenti in MSIL per aiutare a eseguire il debug della generazione del codice.

Un altro punto: se si desidera eseguire un aspetto personalizzato (ad esempio, si sviluppa un motore di database e si desidera fornire un aspetto di persistenza), è necessario molto più di un semplice re-writer MSIL. Hai bisogno di un'infrastruttura AO che faccia molto del lavoro per te. Quando sviluppi un aspetto personalizzato, direi che l'1% del lavoro è specifico per il tuo aspetto personalizzato, il 39% è l'infrastruttura dell'aspetto e il 60% è il materiale di MSIL. Spesso sono in grado di programmare un aspetto molto specifico in un paio d'ore basato su PostSharp.

Quindi, tornando alla tua domanda, e ovviamente con il mio biais, direi: se vuoi scrivere un obfuscator, un merger/shrinker e così via, piuttosto vai su Mono.Cecil o Microsoft.CCI per il l'unica ragione per cui la loro licenza è più amichevole di quella di PostSharp. Ma se vuoi solo sviluppare un aspetto personalizzato, l'utilizzo di PostSharp ti farà risparmiare settimane e rimarrai sorpreso dalle condizioni commerciali che potremmo offrire se prevedi di ridistribuire PostSharp.

+0

Sembra buono. Immagino che continuerò con PostSharp da quando sono stato soddisfatto fino ad ora. –