Открытый сгенерированный сборочный код кажется пустым в Reflector, если это не так.

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

Я уже пробовал 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 плагин для отражателя, который не помогает с этой проблемой.

1 ответ

Решение

Заменить:

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

С:

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

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

Другие вопросы по тегам