Получить исходный код имени файла файла из типа в отладочной сборке - PullRequest
5 голосов
/ 28 октября 2010

Учитывая объект Type в .NET, могу ли я получить имя файла исходного кода? Я знаю, что это будет доступно только в сборках Debug, и это нормально, я также знаю, что могу использовать объект StackTrace, чтобы получить имя файла для определенного кадра в стеке вызовов, но это не то, что я хочу.

Но могу ли я получить имя файла исходного кода для данного System.Type?

Ответы [ 3 ]

4 голосов
/ 24 марта 2015

Я столкнулся с подобной проблемой.Мне нужно было найти имя файла и номер строки конкретного метода только с типом класса и именем метода.Я на старой моно версии .net (Unity 4.6).Я использовал библиотеку cecil, она предоставляет некоторый помощник для анализа вашего pbd ​​(или mdb для моно) и анализа отладочных символов.https://github.com/jbevain/cecil/wiki

Для данного типа и метода:

System.Type myType = typeof(MyFancyClass);
string methodName = "DoAwesomeStuff";

Я нашел это решение:

Mono.Cecil.ReaderParameters readerParameters = new Mono.Cecil.ReaderParameters { ReadSymbols = true };
Mono.Cecil.AssemblyDefinition assemblyDefinition = Mono.Cecil.AssemblyDefinition.ReadAssembly(string.Format("Library\\ScriptAssemblies\\{0}.dll", assemblyName), readerParameters);

string fileName = string.Empty;
int lineNumber = -1;

Mono.Cecil.TypeDefinition typeDefinition = assemblyDefinition.MainModule.GetType(myType.FullName);
for (int index = 0; index < typeDefinition.Methods.Count; index++)
{
    Mono.Cecil.MethodDefinition methodDefinition = typeDefinition.Methods[index];
    if (methodDefinition.Name == methodName)
    {
        Mono.Cecil.Cil.MethodBody methodBody = methodDefinition.Body;
        if (methodBody.Instructions.Count > 0)
        {
            Mono.Cecil.Cil.SequencePoint sequencePoint = methodBody.Instructions[0].SequencePoint;
            fileName = sequencePoint.Document.Url;
            lineNumber = sequencePoint.StartLine;
        }
    }
}

Я знаю, что уже немного поздно :), но я надеюсь,это кому-нибудь поможет!

3 голосов
/ 21 августа 2012

Я использовал такой код, чтобы получить исходный файл и номер строки из запущенного метода:

//must use the override with the single boolean parameter, set to true, to return additional file and line info

System.Diagnostics.StackFrame stackFrame = (new System.Diagnostics.StackTrace(true)).GetFrames().ToList().First();

//Careful:  GetFileName can return null even though true was specified in the StackTrace above.  This may be related to the OS on which this is running???

string fileName = stackFrame.GetFileName();
string process = stackFrame.GetMethod().Name + " (" + (fileName == null ? "" : fileName + " ") + fileLineNumber + ")";
3 голосов
/ 28 октября 2010

Учитывая, что по крайней мере C # поддерживает частичные объявления классов (скажем, public partial class Foo в двух файлах исходного кода), что будет означать «имя файла исходного кода для данного System.Type»?Если объявление типа распределено по нескольким файлам исходного кода в одной сборке, в исходном коде нет единой точки, где начинается объявление.

@ Дарин Димитров: Это не похоже на дубликат"Как получить имя исходного файла и номер строки члена типа?"для меня, поскольку речь идет о типе member , тогда как этот вопрос о type .

...