2010-10-18 3 views
3

Я создаю динамическую сборку, используя Reflection.Emit, которая включает в себя один класс. У меня есть ошибка, которая вызывает исключение BadImageException. Чтобы решить эту проблему, мне нужно увидеть скомпилированный код, и поэтому я сохраняю динамическую сборку на диск.Открытый код сгенерированный сгенерированный код пуст в Reflector, если он отсутствует.

Я уже пробовал PEVerify против сборки, которая кажется, что ошибок нет. Теперь я хочу просмотреть сгенерированный код в Reflector, но сборка выглядит пустой (что я знаю, что это не так).

Любая идея, почему это происходит?

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"); 

Кстати, я уже использую Relection.Emit плагин для отражателя, который не поможет с этим вопросом.

+0

BadImageFormatException? Это странно. Оптимизируйте исключение лучше, сообщение + трассировка стека. –

+1

Пуста, если вы посмотрите на нее с ildasm как тоже? –

+0

Нет, это исключение BadImage, вызванное некоторой ошибкой при испускании кода IL. Даже если я верну свой код, чтобы он не выдавал исключение, я все еще не могу просмотреть испущенный код в Reflector. – TheCodeKing

ответ

10

Заменить:

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

С:

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

Тогда искать его в текущем каталоге, возможно папку бин. Ассембли и модули являются технически двумя отдельными объектами, и вы сохраняете информацию об ассамблее, а не информацию о модуле (где весь ваш код живет). (Кроме того, не называйте их оба с одинаковым именем файла, конечно.)

+0

Это не имеет значения, в любом случае файл выписан. – TheCodeKing

+0

@ TheCodeKing, вы попробовали? В любом случае файл выписывается, но, что важно, ** не совпадает с содержимым файла **. –

+0

Извините, я забрал его, я все еще открывал temp.dll, но на самом деле он создал другую сборку под названием «an.assembly.dll», которая содержит код! Большое вам спасибо, я потратил много времени, пытаясь понять это. – TheCodeKing

Смежные вопросы