2009-08-31 5 views
8

Ho un sistema di template che sembra simile al vecchio codice ASP. Lo faccio attraverso una classe che riscrive l'intera cosa in codice sorgente C#, compila e infine la esegue.Esiste una direttiva #pragma o simile per il codice C# generato per far corrispondere i numeri di riga del codice modello al numero di riga C#?

Quello che mi chiedo è se esiste un qualche tipo di direttiva # pragma-like Posso cospargere il codice C# generato con quello far sì che gli errori di compilazione corrispondano ai numeri di riga nel mio file modello?

Per esempio, diciamo che ho questa prima e unica linea nel mio codice modello:

Object o = datta; // should be data, compiler error 

ma poi, al fine di compilare questo devo aggiungere uno spazio dei nomi, una classe, un metodo, e un po 'della caldaia -scrive il codice, quindi questa riga sopra, che è la riga # 1 nel mio file modello, in realtà finisce con la linea # 17 (numero casuale, solo a scopo illustrativo) nel codice C#. L'errore del compilatore segnalerà naturalmente il mio errore come sulla linea n. 17 e non sulla linea n.

Ricordo da un altro linguaggio di programmazione che ho usato in precedenza (anche se non riesco a ricordare quale) che aveva una direttiva che potevo aggiungere, che avrebbe fatto in modo che i numeri di riga degli errori si allineino.

Esiste qualcosa del genere in C# 3.5?

risposta

16

Hai il numero #line preprocessor directive.

#line consente di modificare il numero di riga del compilatore e (facoltativamente) l'output del nome del file per errori e avvisi.

#line directive può essere utilizzato in una fase intermedia automatizzata del processo di compilazione. Ad esempio, se le righe sono state rimosse dal file del codice sorgente originale, ma si desidera comunque che il compilatore generi output in base alla numerazione delle righe originale nel file, è possibile rimuovere le linee e quindi simulare la numerazione delle righe originale con #line.

Il #line hidden direttiva nasconde le righe successive del debugger, tale che, quando le fasi di sviluppo attraverso il codice, eventuali linee tra un #line hidden e prossima direttiva #line (supponendo che non sia un'altra direttiva nascosto #line) sarà essere calpestato. Questa opzione può anche essere utilizzata per consentire a ASP.NET di distinguere tra codice definito dall'utente e codice generato automaticamente. Sebbene ASP.NET sia il principale consumatore di questa funzionalità, è probabile che altri generatori di sorgenti ne faranno uso.

A #line hidden la direttiva non ha alcun effetto sui nomi di file o sui numeri di riga nella segnalazione degli errori. Cioè, se si incontra un errore in un blocco nascosto, il compilatore riporterà il nome del file corrente e il numero di riga dell'errore.

La direttiva #line filename specifica il nome del file che si desidera visualizzare nell'output del compilatore. Per impostazione predefinita, viene utilizzato il nome effettivo del file del codice sorgente. Il nome del file deve essere tra virgolette doppie ("") e deve essere preceduto da un numero di riga.

+0

+1, impara qualcosa di nuovo ogni giorno – JaredPar

+0

Questo era esattamente ciò di cui avevo bisogno! Grazie! –

+0

@ Jared: l'ho visto un giorno a guardare attraverso il codice WPF generato ed era tipo. : hmm: :) È ciò che collega gli errori al file XAML di origine. –