Существует ли какая-либо директива #pragma или подобная директива для сгенерированного кода C#, чтобы сопоставить номера строк кода шаблона с номерами строк C#?
У меня есть система шаблонов, которая похожа на старомодный ASP-код. Я прогоняю это через класс, который переписывает все это в исходный код C#, компилирует и, наконец, выполняет его.
Интересно, есть ли какая-то директива #pragma-like, которой я могу посыпать сгенерированный код C#, чтобы ошибки компиляции соответствовали номерам строк в моем файле шаблона?
Например, предположим, что у меня есть первая и единственная строка в моем коде шаблона:
Object o = datta; // should be data, compiler error
Но затем, чтобы скомпилировать это, я должен добавить пространство имен, класс, метод и некоторый код котельной плиты к нему, так что эта строка выше, которая является строкой #1 в моем файле шаблона, фактически заканчивается строкой #17 (случайное число, просто для иллюстрации) в коде C#. Ошибка компилятора, естественно, помечает мою ошибку как находящуюся в строке #17, а не в строке #1.
Я помню из другого языка программирования, который я использовал раньше (хотя я не могу вспомнить, какой именно), что у него была директива, которую я мог добавьте, что бы номера строк ошибок выстроились в линию.
Есть ли такая вещь в C# 3.5?
1 ответ:
У вас есть
#line
директива препроцессора .
#line
позволяет изменять номер строки компилятора и (необязательно) имя файла, выводимого для ошибок и предупреждений.
#line directive
может использоваться на автоматизированном промежуточном этапе процесса сборки. Например, если строки были удалены из исходного файла исходного кода, но компилятор по-прежнему должен генерировать выходные данные на основе исходной нумерации строк в файле, можно удалить линии, а затем имитировать исходную нумерацию строк с помощью#line
.
#line hidden
директива скрывает последовательные строки от отладчика, так что, когда разработчик проходит через код, любые строки между директивой#line hidden
и следующей директивой#line
(предполагая, что это не другая скрытая директива #line) будут перешагнуты. Этот параметр также можно использовать для разрешения ASP.NET чтобы различать пользовательский и машинный код. Хотя ... ASP.NET является основным потребителем эта функция, вероятно, будет использоваться большим количеством генераторов источников.A
#line hidden
директива не влияет на имена файлов или номера строк в отчетах об ошибках. То есть, если в скрытом блоке обнаружена ошибка, компилятор сообщит текущее имя файла и номер строки ошибки.
#line filename
директива задает имя файла, которое должно отображаться в выходных данных компилятора. По умолчанию используется фактическое имя файла исходного кода. Имя файла должно быть заключено в двойные кавычки ( "" ) и предваряться номером строки.