給定.NET中的Type對象,我可以獲取源代碼文件名嗎?我知道這隻會在調試版本中可用,這很好,我也知道我可以使用StackTrace對象來獲取調用堆棧中特定幀的文件名,但這不是我想要的。從調試版本中的類型獲取文件的源代碼文件名
但是我可以得到給定System.Type的源代碼文件名嗎?
給定.NET中的Type對象,我可以獲取源代碼文件名嗎?我知道這隻會在調試版本中可用,這很好,我也知道我可以使用StackTrace對象來獲取調用堆棧中特定幀的文件名,但這不是我想要的。從調試版本中的類型獲取文件的源代碼文件名
但是我可以得到給定System.Type的源代碼文件名嗎?
考慮到至少C#支持部分類聲明(例如,public partial class Foo
在兩個源代碼文件中),「給定System.Type的源代碼文件名」是什麼意思?如果類型聲明分散在同一個程序集內的多個源代碼文件中,那麼在聲明開始的源代碼中沒有單一的點。
@Darin Dimitrov:這看起來不像「如何獲取源文件名和類型成員的行號?」的副本。對我來說,因爲這是一個類型成員,而這個問題是關於類型。我用這樣的代碼
我們在我的公司大規模地重構名稱空間和類似的東西,我想編寫一個單元測試來檢查命名空間是否對應到文件位置。我們現在實際上已經完成了,所以我不再需要它了,但問題仍然存在,必須有某種方法可以訪問pdb並獲取此信息?至於部分類,那麼我們應該能夠獲得這兩個文件名。 – 2010-11-08 07:27:10
@Michael它會是'string []':-D – 2013-07-17 12:22:16
@Simon_Weaver嗯,但是,OP要求爲給定System.Type輸入*** ***源代碼文件名:-) – 2013-07-17 12:32:17
擺脫方法正在運行的源文件和行號:
//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 + ")";
我遇到了類似的問題。我只需要使用類的類型和方法名稱來找到特定方法的文件名和行號。我在一箇舊的單聲道.net版本(統一4.6)。我使用了庫cecil,它提供了一些幫助來分析您的pbd(或mdb for mono)並分析調試符號。 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;
}
}
}
我知道這是一個有點晚:)但我希望這會幫助別人!
[如何獲取源文件名和類型成員的行號?](http://stackoverflow.com/questions/126094/how-to-get-the-source-file-name線型號的會員) – 2010-10-28 07:29:06
你爲什麼要這樣做?我能想到的大部分原因都可以通過像Symbol/Source服務器這樣的工具來解決...... – 2010-10-28 22:16:42