Существует ли какая-либо #pragma или аналогичная директива для сгенерированного кода C# для сопоставления номеров строк кода шаблона с номером строки C#?

У меня есть система шаблонов, похожая на код ASP в старом стиле. Я запускаю это через класс, который переписывает все это в исходный код C#, компилирует и, наконец, выполняет.

Мне интересно, есть ли какая-то #pragma-подобная директива, которой я могу посыпать сгенерированный код C#, чтобы ошибки компиляции соответствовали номерам строк в моем файле шаблона?

Например, допустим, у меня есть эта первая и единственная строка в моем коде шаблона:

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

но затем, чтобы скомпилировать это, я должен добавить к нему пространство имен, класс, метод и некоторый шаблонный код, поэтому эта строка выше, которая является строкой № 1 в моем файле шаблона, на самом деле заканчивается строкой № 17. (случайное число, просто для иллюстрации) в коде C#. Ошибка компилятора, естественно, пометит мою ошибку как находящуюся в строке № 17, а не в строке № 1.

Я помню из другого языка программирования, который я использовал раньше (хотя я не могу вспомнить, какой именно), что у него была директива, которую я мог добавить, чтобы номера строк с ошибками выровнялись.

Есть ли что-то подобное в C# 3.5?


person Lasse V. Karlsen    schedule 31.08.2009    source источник


Ответы (1)


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

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

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

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

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

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

person Sam Harwell    schedule 31.08.2009
comment
Это было именно то, что мне было нужно! Спасибо! - person Lasse V. Karlsen; 31.08.2009
comment
@Jared: Однажды я увидел это, просматривая сгенерированный код WPF, и мне понравилось. :hmm: :) Это то, что связывает ошибки с исходным файлом XAML. - person Sam Harwell; 31.08.2009