Существует ли какая-либо директива #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 8

1 ответ:

У вас есть #line директива препроцессора .

#line позволяет изменять номер строки компилятора и (необязательно) имя файла, выводимого для ошибок и предупреждений.

#line directive может использоваться на автоматизированном промежуточном этапе процесса сборки. Например, если строки были удалены из исходного файла исходного кода, но компилятор по-прежнему должен генерировать выходные данные на основе исходной нумерации строк в файле, можно удалить линии, а затем имитировать исходную нумерацию строк с помощью #line.

#line hidden директива скрывает последовательные строки от отладчика, так что, когда разработчик проходит через код, любые строки между директивой #line hidden и следующей директивой #line (предполагая, что это не другая скрытая директива #line) будут перешагнуты. Этот параметр также можно использовать для разрешения ASP.NET чтобы различать пользовательский и машинный код. Хотя ... ASP.NET является основным потребителем эта функция, вероятно, будет использоваться большим количеством генераторов источников.

A #line hidden директива не влияет на имена файлов или номера строк в отчетах об ошибках. То есть, если в скрытом блоке обнаружена ошибка, компилятор сообщит текущее имя файла и номер строки ошибки.

#line filename директива задает имя файла, которое должно отображаться в выходных данных компилятора. По умолчанию используется фактическое имя файла исходного кода. Имя файла должно быть заключено в двойные кавычки ( "" ) и предваряться номером строки.