2012-02-12 9 views
6

Traté de ejecutar el código de ejemplo que aparece en la página de documentación para la clase System.Reflection.Emit.LocalBuilder pero parece que las llamadas a LocalBuilder.SetLocalSymInfo(string, int, int) no están haciendo nada ya que la IL Dissasembler muestra esto como la IL para SampleAssembly.dll:¿Por qué LocalBuilder.SetLocalSymInfo no emite nombres de variables?

.method public static string Function1(int32 A_0) cil managed 
{ 
    // Code size  10 (0xa) 
    .maxstack 1 
    .locals init (string V_0, 
      int32 V_1) 
    IL_0000: ldarg.0 
    IL_0001: stloc.1 
    IL_0002: ldstr  "string value" 
    IL_0007: stloc.0 
    IL_0008: ldloc.0 
    IL_0009: ret 
} // end of method Example::Function1 

¿Por qué no se enumeran los nombres de las variables (myString y myInt) en el Disasembler?

Ambiente Info:

  • Windows 7 64 bits
  • Visual Studio 2010 SP1 Profesional
  • .Net 4.0.30319 SP1
  • marco de destino: .Net 4 Client Profile
  • configuración de depuración (para el programa que usa System.Reflection.Emit)

Editar: Como noté en un comentario, se está generando un archivo SampleAssembly.pdb junto con el archivo SampleAssembly.dll.

Respuesta

5

El soporte de depuración en System.Reflection.Emit es bastante pobre y estrafalario (y en cierta medida esto también es cierto para IKVM.Reflection, ya que hereda parte de la ruptura de la API de escritor .pdb subyacente que tiene que ser utilizado ya que el formato de archivo .pdb no está documentado).

De todos modos, la razón por la muestra no funciona es que no se encuentra el siguiente código:

ISymbolDocumentWriter doc = myModule.DefineDocument("sourcefile", Guid.Empty, Guid.Empty, Guid.Empty); 

myMethodIL.MarkSequencePoint(doc, 1, 0, 1, 0); 

Debe haber al menos un punto único de secuencia en el método, porque esa es la forma en que el interno las estructuras de datos están unidas.

+0

Gracias, le otorgaré mi recompensa cuando puedo, (en 17 horas, +200 pts) pero no puedo marcar esto como la respuesta correcta (que es) ya que no hice la pregunta original. – thr

+0

Ahí vamos, recompensa otorgada, perdón por la demora :) – thr

1

Sospecho que esto se debe a que está construyendo el módulo como una versión DLL.

Trate de pasar true como segundo parámetro a AssemblyBuilder.DefineDynamicModule

+0

Si mira en la muestra que he vinculado, el autor está llamando a 'AssemblyBuilder.DefinDynamicModule (string, string, true)'. También puedo ver que hay un archivo SampleAssembly.pdb en el directorio actual. –

1

Los nombres simbólicos se almacenan en el archivo PDB y no en la asamblea.

Una herramienta como Reflector.NET cargará el archivo PDB si está presente para dar mejores nombres al código desensamblado.

También puede verificar esto depurando el código en un depurador con y sin el archivo PDB.

+1

He inspeccionado el archivo .pdb, ¡no hay nada allí! – thr

Cuestiones relacionadas