2014-04-05 7 views
7

Ho una situazione in cui una parte del mio codice viene generata tramite CodeExpressions e l'altra dall'utente stesso (come in: l'utente scrive semplicemente il suo codice come al solito, che poi prenderei e aggiungere al mio assembly quando compila) .Possiamo costruire un assieme sia da CodeExpressions sia da codice sorgente letterale allo stesso tempo?

È possibile generare un assieme che contiene entrambi questi elementi? Avvertenza: questi due approcci conterranno classi partial quindi devono essere nello stesso assembly.

Un altro approccio che avevo in mente era di tradurre entrambi in una rappresentazione di stringa e quindi di generare l'assembly da quella stringa, ma dubito di poter ottenere il codice sorgente da un tipo generato dall'utente (al momento della compilazione tempo).

Lavorando su questa idea potrei scrivere il codice generato da CodeExpressions in un file di testo e combinarlo con i file .cs. Una cronologia sarebbe simile a questa: ha scritto

  • utente le sue lezioni
  • CodeDom albero è messa a punto a livello di codice
  • utente costruisce il progetto
  • CodeDom genera origine a un file di testo
  • programma legge i contenuti degli utenti -defined .cs file
  • Programma letto file di testo generato
  • Programma combina questi due
  • programma crea una nuova .dll dal codice sorgente combinata

ho potuto saltare i (ridondanti) fasi di scrittura e la lettura della mia fonte CodeDom generato un file di testo e semplicemente scriverlo nella memoria come pure, naturalmente. In effetti, potrebbe essere più semplice usare i modelli di T4 pre-elaborati e caricare i risultati di questi modelli in memoria e compilare un assembly da quella stringa.

Come potete vedere, questo è molto caotico ma in questo momento sembra il più fattibile. Ho esaminato le opzioni che potrebbero renderlo più semplice?

Background:

che sto creando una libreria che creerà un assieme con classi definite dall'utente. Il modo in cui funziona è nel seguente ordine:

  • Riferimenti mia biblioteca nel suo progetto
  • utente crea nuova TinyTypeSetup esempio
  • utente aggiunge definizioni Piccoli tipo ad esso
  • utente esegue il programma
  • Programma genera assembly dai tipi dati tramite CodeDom

Quello che sto cercando di aggiungere ora è la possibilità per consentire all'utente di creare i propri file di origine e aggiungere immediatamente tali file all'assieme che viene generato. Ciò consentirebbe all'utente di specificare classi parziali con i propri metodi, oltre a quelli che ho generato io stesso.

+0

Sono confuso. Potresti spiegare in maggior dettaglio perché non puoi semplicemente compilare tutto come stringhe (o tipi di CodeDOM, usando ['CodeSnippetCompileUnit'] (http://msdn.microsoft.com/en-us/library/system.codedom.codesnippetcompileunit? aspx)) allo stesso tempo? – svick

+0

@svick: teoricamente potrei, ma questo significherebbe che devo assemblare quella stringa io stesso. Generare una stringa attraverso il mio codice sorgente sarebbe molto incline a errori di battitura e piuttosto brutto per sporcare la mia fonte con un mucchio di stringhe. –

+0

@svick: ho aggiunto alcune informazioni di base –

risposta

5

Non si sta parlando di uno scenario in cui CodeExpression è sempre utile. È un generatore di codice sorgente, il tipo specifico di codice sorgente generato viene determinato dal provider selezionato.

Ma in nessun caso l'utente del tuo progetto si preoccupa veramente di quel linguaggio nel tuo uso previsto. Non lo guarda mai, non lo compila mai da solo. Solo a te interessa, devi scegliere il CodeCompiler giusto. L'utente sceglie solo l'assemblaggio che produce. E con le convenzioni .NET, il linguaggio utilizzato per creare un assembly non ha mai importanza. I metadati all'interno dell'assieme sono completamente indipendenti dalla lingua.

CodeObjects sono utili in uno scenario in cui il codice sorgente viene generato automaticamente e aggiunto al progetto dell'utente. Da compilare, più tardi, quando l'utente costruisce il suo progetto. I buoni esempi sono i vari designer integrati in Visual Studio, come il progettista di risorse e il progettista di Winforms. Per necessità, essi devono generare il codice che corrisponde al tipo di progetto dell'utente.

Dovrebbe essere evitato fortemente se non ne hai bisogno. Il più grande blocco con i generatori di codice CodeDom è che è solo in grado di generare un sottoinsieme delle istruzioni valide in una lingua. E ovviamente brutto da usare, si alleggerisce il tuo codice. Hai solo bisogno di generare del testo, la lingua che scegli non ha importanza. Dal momento che sembra preferire C#, questo è il tipo di testo che dovresti generare.

Considerare la soluzione più grande. Probabilmente funzionerebbe molto meglio se l'utente potesse infatti aprire un designer personalizzato all'interno di Visual Studio stesso. Quindi questo passaggio in più, eseguire quel traduttore per passare da TinyType a un assembly non è più necessario. Più facile da usare, illumina anche IntelliSense. Ora lo fa ha senso generare codice. Questo richiederà molto lavoro, la creazione di designer non è così semplice. Tieni gli occhi fissi sulla palla, nessun utente apprezzerà la generazione di quel file XML di cui hai bisogno. Creare minuscoli tipi in C# è già facile, non ha bisogno di molto aiuto. In entrambi i casi, l'utente che compone i propri tipi dai tuoi minuscoli tipi non ha nemmeno bisogno di aiuto. VS lo supporta già direttamente.

+0

Ho pensato che un'estensione di Visual Studio sarebbe probabilmente la soluzione migliore qui.Dato che l'obiettivo di questo piccolo progetto è quello di adattarsi alla libreria CodeDom, darò un'altra occhiata al suggerimento di Akash Kava e forse ricorreremo alla mia soluzione alternativa come descritto nella domanda. Apprezzo l'input dato! –

0

Anche se c'è un po 'di una curva di apprendimento. Ma sicuramente meglio che occuparti di stringhe da solo. Guardando in .NET Compiler Platform (Roslyn) per i potenziali clienti può aiutare, Overview to start with.

Fornisce funzioni di API di trasformazione & analisi semantica. Funzionalità di diagnostica e correzione dei codici.

+0

Mentre sono certo che Roslyn offre opzioni interessanti, mi piacerebbe vedere alcune informazioni più dettagliate. In che modo esattamente affronta questo problema e potresti fornire alcune indicazioni esplicite (un esempio?)? –

Problemi correlati