2010-10-18 2 views
3

Je génère un assemblage dynamique à l'aide de Reflection.Emit qui inclut une seule classe. J'ai un bogue qui cause une erreur BadImageException. Pour résoudre ce problème, j'ai besoin de voir le code compilé, et donc je sauvegarde l'assemblage dynamique sur le disque.Le code généré par l'assembly Open Emitted apparaît vide dans Reflector alors qu'il ne l'est pas.

J'ai déjà essayé PEVerify contre l'ensemble qui semble penser qu'il n'y a pas d'erreurs. Je veux maintenant voir le code généré dans Reflector, mais l'assemblage apparaît vide (ce que je sais que ce n'est pas le cas).

Une idée de pourquoi cela se passe-t-il?

var assemblyName = new AssemblyName("An.Assembly"); 
var appDomain = Thread.GetDomain(); 
var assemblyBuilder = appDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); 
var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name); 
var typeBuilder = moduleBuilder.DefineType("MyClass", TypeAttributes.Public | TypeAttributes.Class); 
... 
typeBuilder.CreateType(); 
assemblyBuilder.Save("temp.dll"); 

Par la façon dont je suis déjà à l'aide du plug-in Relection.Emit pour réflecteur qui ne contribue pas à cette question.

+0

BadImageFormatException? C'est bizarre. Documenter l'exception mieux, message + pile trace. –

+1

Est-il vide quand on le regarde avec aussi ildasm? –

+0

Non c'est BadImageException causée par une erreur dans l'émission de code IL. Même si je retourne mon code pour qu'il ne lève pas l'exception, je suis toujours incapable d'afficher le code émis dans Reflector. – TheCodeKing

Répondre

10

Remplacer:

var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name); 

Avec:

var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, "yourfilename.dll"); 

recherche alors dans votre répertoire courant, probablement votre dossier bin. Les assemblages et les modules sont techniquement deux entités distinctes, et vous n'enregistrez que les informations d'assemblage, pas les informations de module (où tout votre code vit). (Aussi, ne les nommez pas tous les deux avec le même nom de fichier, bien sûr.)

+0

Cela ne fait aucune différence, dans les deux cas, le fichier est écrit. – TheCodeKing

+0

@TheCodeKing, l'avez-vous essayé? Dans les deux cas, le fichier est écrit, mais, surtout, ** pas le même fichier ** contenu. –

+0

désolé je le reprends, j'étais encore en train d'ouvrir le temp.dll mais il est en fait créé un autre assemblage appelé "an.assembly.dll" qui contient le code! Merci beaucoup, j'ai passé beaucoup de temps à essayer de comprendre celui-ci. – TheCodeKing

Questions connexes