Pregunta

Recientemente compré el libro de Ayende Construyendo DSLS en Boo (Cómpralo, léelo, es increíble) pero me estoy enfrentando a un problema de implementación y quiero ver cómo se ve el código generado. Normalmente usaría Reflector para mirar el código, pero en este caso los ensamblados son dinámicos y solo en la memoria. ¿Hay alguna manera de guardar ensamblajes dinámicos en el disco para que pueda reflejarlos?

Editar / mi respuesta:

Vaya, tardó un tiempo en volver a este. Lamentablemente, dejé un poco de la pregunta original.

Bit importante: estoy usando Biblioteca Rhinodsl de Ayende Como recomienda en el libro. Tengo acceso al compilador Boo en mi subclase de DSLENGINE que se ve así:

public class JobEngine : DslEngine
{
    protected override void CustomizeCompiler(Boo.Lang.Compiler.BooCompiler compiler, Boo.Lang.Compiler.CompilerPipeline pipeline, string[] urls)
    {
        pipeline.Insert(1, new ImplicitBaseClassCompilerStep(typeof (JobBase), "Prepare", "JobLanguage", "log4net", "Quartz"));
    }
}

Para cambiar lo menos y obtener lo que quería, necesitaba agregar una línea ...

public class JobEngine : DslEngine
{
    protected override void CustomizeCompiler(Boo.Lang.Compiler.BooCompiler compiler, Boo.Lang.Compiler.CompilerPipeline pipeline, string[] urls)
    {
        compiler.Parameters.GenerateInMemory = false; // <--- This one.
        pipeline.Insert(1, new ImplicitBaseClassCompilerStep(typeof (JobBase), "Prepare", "JobLanguage", "log4net", "Quartz"));
    }
}

Esto provocó que el compilador emitiera el ensamblaje a mi directorio ~ LocalSettings TEMP y luego pude reflejarlo. Es importante tener en cuenta que hacer ese cambio causó que el resto del programa se rompiera (Rhinodsl ya no pudo encontrar los ensamblajes en la memoria porque los llevo al disco), por lo que esto solo es útil como herramienta de depuración.

¿Fue útil?

Solución

Mire hacia arriba donde se instancia boocompiler, cambie la tubería desde Compiletomemería a Compileto

Otros consejos

Sí el AssemblyBuilder la clase tiene un Save Método para este propósito. Debe usar el modo apropiado para esto, que es muy probable RunAndSave:

AssemblyBuilder builder =
    AppDomain.CurrentDomain.DefineDynamicAssembly(
        name, AssemblyBuilderAccess.RunAndSave);
// build assembly
builder.Save(path);

Si puede obtener el ensamblaje en tiempo de ejecución.

es decir

Assembly assembly = typeof(YourDynamicType).Assembly;

Luego puede colocar este ensamblaje en AssemblyBuilder y llamar al método Guardar.

AssemblyBuilder assemblyBuilder = (AssemblyBuilder)assembly;
assemblyBuilder.Save(yourPath);

Puede haber una manera más fácil de hacerlo, pero si no le importa usar WindBG, puede guardar cualquier ensamblaje administrado cargado de la memoria (WindBG usa el módulo de término, pero también funciona para ensamblajes administrados).

Utilizar el !savemodule comando con la dirección del ensamblaje. Si no tiene la dirección, use el lm vm comando con el nombre del módulo. Después de eso obtienes un ensamblaje de DLL regular, que puedes inspeccionar en reflector.

Por supuesto, también puede mirar el código IL en la memoria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top