2012-01-06 14 views
12

El atributo DebuggerStepThrough le permite omitir irrumpir en ciertos métodos/clases/propiedades.¿Puede DebuggerStepThrough heredarse en la implementación IEnumerable generada automáticamente?

En DebuggerStepThrough being ignored se aclara que el compilador de C# no hereda este atributo en la implementación del IEnumerable<T> generado por el compilador.

Un ejemplo trivial de un fallo de este tipo es:

static void Main(string[] args) 
{ 
    var a = SkipMe().ToList(); 
} 

[System.Diagnostics.DebuggerStepThrough] 
static IEnumerable<int> SkipMe() 
{ 
    // comment out line below and the throw will be stepped over. 
    yield return 1; 
    throw new Exception(); 
} 

¿Hay una manera de conseguir el compilador de C# para añadir el atributo DebuggerStepThrough a la auto generada escribir?

¿Hay alguna manera de que visual studio omita la depuración en cualquier tipo con el atributo [CompilerGenerated]?

-

Adición: algunas capturas de pantalla ilustrativas

Resultado después de pulsar F5

screen 1

screen 2

Visual Studio Versión:

snip 3

Nuestro atributo que falta:

the missing attribute

+0

para aquellos que se preguntan por qué, al utilizar Dapper lo incluimos como una fuente de código fuente, me gustaría evitar entrar en cualquier código Dapper durante el uso regular y no quiero agregar un dll al proyecto solo por eso. –

+0

No puedo entender esta pregunta. El compilador ya aplica el atributo [DebuggerHidden] a los métodos de clase del iterador. El ejemplo en el fragmento no tiene sentido, el depurador siempre se detiene en una excepción no detectada. El comentario en el método SkipMe() no tiene sentido, * * no pasa sobre la instrucción throw. Al menos no en VS2008, no puede decir de qué versión está hablando. –

+1

@hans vs 2010 .net 4, el iterador solo tiene el compilador generado, lo registré en el reflector –

Respuesta

3

No creo que hay una manera de conseguir el efecto que está buscando.

  • No hay forma de que el compilador de C# copie este atributo en el método de generación de máquina de estados.
  • No puede evitar esto agregando DebuggerStepThrough a la clase que contiene el método de iterador. El depurador solo busca el tipo principal inmediato, no los tipos que contienen un tipo anidado.

La única manera real que se me ocurre para lograr esto es poner todo el código que no desea depurar en una DLL por separado. Entonces no cargue el PDB para esa DLL particular.

+1

bueno, hay una forma más ... podrías PostSharp o Mono.Cecil para inyectar el atributo en una compilación secundaria :) pero sí ... esto es más o menos lo que yo pensaba. –

+0

@SamSaffron sí. Definitivamente es posible a través de algún tipo de proceso de reescritura posterior a IL. – JaredPar

+0

@SamSaffron hay otra forma: implementar su propia clase de enumerador, aplicar el atributo allí y devolver una instancia de eso desde el método SkipMe. – phoog

Cuestiones relacionadas