Ein*_*son 5 .net c# debug-symbols
给定.NET中的Type对象,是否可以获取源代码文件名?我知道这只能在Debug版本中使用,这很好,我也知道我可以使用StackTrace对象来获取callstack中特定帧的文件名,但这不是我想要的.
但是我可以获取给定System.Type的源代码文件名吗?
我遇到了类似的问题。我需要找到特定方法的文件名和行号,只需要类的类型和方法名称。我使用的是旧的 Mono .net 版本(unity 4.6)。我使用了库 cecil,它提供了一些帮助来分析您的 pbd(或用于单声道的 mdb)和分析调试符号。https://github.com/jbevain/cecil/wiki
对于给定的类型和方法:
System.Type myType = typeof(MyFancyClass);
string methodName = "DoAwesomeStuff";
Run Code Online (Sandbox Code Playgroud)
我找到了这个解决方案:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这有点晚了 :) 但我希望这会对某人有所帮助!
考虑到至少 C# 支持部分类声明(例如,public partial class Foo在两个源代码文件中),“给定 System.Type 的源代码文件名”意味着什么?如果类型声明分布在同一程序集中的多个源代码文件中,则源代码中不存在声明开始的单个点。
@Darin Dimitrov:这看起来不像“如何获取源文件名和类型成员的行号?”的重复。对我来说,因为那是关于类型成员的,而这个问题是关于类型的。
| 归档时间: |
|
| 查看次数: |
2524 次 |
| 最近记录: |