c# - org - mapwindows 5
¿Cómo obtener el nombre del archivo de origen y el número de línea de un miembro de tipo? (5)
El ejemplo de código en la siguiente URL proporciona una clase que puede modificar fácilmente para obtener la información que busca:
http://blogs.msdn.com/rmbyers/pages/code-sample-stacktrace-with-manual-symbol-lookup.aspx
Teniendo en cuenta que el archivo de datos de depuración está disponible (PDB) y utilizando System.Reflection u otro marco similar como Mono.Cecil , cómo recuperar mediante programación el nombre del archivo de origen y el número de línea donde un tipo o un miembro de un tipo es declarado.
Por ejemplo, supongamos que ha compilado este archivo en un ensamblado:
C: / MyProject / Foo.cs
1: public class Foo
2: {
3: public string SayHello()
4: {
5: return "Hello";
6: }
7: }
Cómo hacer algo como:
MethodInfo methodInfo = typeof(Foo).GetMethod("SayHello");
string sourceFileName = methodInfo.GetSourceFile(); // ?? Does not exist!
int sourceLineNumber = methodInfo.GetLineNumber(); // ?? Does not exist!
sourceFileName contendría "C: / MyProject / Foo.cs" y sourceLineNumber sería igual a 3.
Actualización: System.Diagnostics.StackFrame
es capaz de obtener esa información, pero solo en el ámbito de la pila de llamadas en ejecución actual. Significa que el método debe invocarse primero. Me gustaría obtener la misma información, pero sin invocar al miembro de tipo.
Al utilizar el lector de PDB proporcionado por el Proyecto de Metadatos de CCI , es posible extraer la ubicación del código de un miembro de tipo determinado. Vea una implementación de ejemplo en el código fuente del Proyecto OSS Gallio .
Puede encontrar ayuda con estos enlaces:
Obtener números de archivo y línea sin desplegar los archivos PDB también encontró esta siguiente publicación
"Hola, Mark,
Lo siguiente le dará el número de línea de su código (en el archivo fuente):
Dim CurrentStack As System.Diagnostics.StackTrace
MsgBox (CurrentStack.GetFrame(0).GetFileLineNumber)
En caso de que le interese, puede conocer la rutina en la que se encuentra, así como a todas las personas que llaman.
Public Function MeAndMyCaller As String
Dim CurrentStack As New System.Diagnostics.StackTrace
Dim Myself As String = CurrentStack.GetFrame(0).GetMethod.Name
Dim MyCaller As String = CurrentStack.GetFrame(1).GetMethod.Name
Return "In " & Myself & vbCrLf & "Called by " & MyCaller
End Function
Esto puede ser muy útil si desea una rutina de error generalizada, ya que puede obtener el nombre de la persona que llama (que sería donde se produjo el error).
Saludos, Fergus MVP [Botón de inicio de Windows, diálogo de apagado] "
Usando uno de los métodos explicados anteriormente, dentro del constructor de un atributo, puede proporcionar la ubicación de origen de todo, que puede tener un atributo, por ejemplo, una clase. Vea la siguiente clase de atributo:
sealed class ProvideSourceLocation : Attribute
{
public readonly string File;
public readonly string Member;
public readonly int Line;
public ProvideSourceLocation
(
[CallerFilePath] string file = "",
[CallerMemberName] string member = "",
[CallerLineNumber] int line = 0)
{
File = file;
Member = member;
Line = line;
}
public override string ToString() { return File + "(" + Line + "):" + Member; }
}
[ProvideSourceLocation]
class Test
{
...
}
El puede escribir, por ejemplo:
Console.WriteLine(typeof(Test).GetCustomAttribute<ProvideSourceLocation>(true));
La salida será:
a:/develop/HWClassLibrary.cs/src/Tester/Program.cs(65):
Método actualizado:
private static void Log(string text,
[CallerFilePath] string file = "",
[CallerMemberName] string member = "",
[CallerLineNumber] int line = 0)
{
Console.WriteLine("{0}_{1}({2}): {3}", Path.GetFileName(file), member, line, text);
}
Nueva Framework API
que rellena argumentos (marcados con atributos especiales) en tiempo de ejecución, vea más en mi respuesta a esta pregunta SO