Вы можете прочитать информацию из файла .pdb и оценить ее самостоятельно. Она содержит все необходимые данные. Я не закончил читать код, но мое понимание таково:
- Вы получаете токен метаданных из рассматриваемого метода путем отражения
- Вы запрашиваете данные pdb для этого токена
- Запись pdb содержит имя исходного файла и номер строки
Маркер метаданных - это 32-разрядное число, состоящее из байта типа и серийного номера. Этот токен описывает каждую отдельную сущность в файле сборки .NET: типы, ссылки на типы, методы, поля и так далее. Это число стоит больше, чем полное пространство имен, тип, имя метода и сигнатура метода, и его легче обрабатывать. Но имейте в виду, что он генерируется компилятором и может отличаться в каждой сборке, поэтому вам всегда нужен файл .pdb из той же сборки.
Файл pdb содержит записи о том, какое смещение IL в каком методе происходит из какого исходного местоположения. Если у вас нет StackFrame, а есть только метод, вы, вероятно, найдете несколько записей о методе, так что вы можете использовать один из них с наименьшим смещением или описать весь диапазон в исходном коде, который определяет метод.
Вот несколько ссылок для дальнейшего чтения, поисковый термин «pdb2xml» - это старый пример кода от Microsoft:
Поскольку .NET API для чтения файлов .pdb требует наличия файлов сборки, это преобразование следует выполнять непосредственно после сборки, чтобы сгенерированный файл XML был действительно переносимым.
Я на самом деле строю этот метод в своем решении для ведения журналов .NET, FieldLog , чтобы разрешить разрешение исходного местоположения из журналов сбоев из сборок релизов и де-обфусцировать следы стека от запутанных сборок. *