Открытый излучаемый сборки сгенерированный код появляется пустым в отражателе, когда это не так.
-
09-10-2019 - |
Вопрос
Я генерирую динамическую сборку с использованием отражения .emit, который включает в себя один класс. У меня есть ошибка, которая вызывает бабинуэкселирование. Чтобы устранить это, мне нужно увидеть скомпилированный код, и поэтому я сохраняю динамическую сборку на диск.
Я уже попробовал PEEvify против сборки, которая, кажется, думает, что нет ошибок. Теперь я хочу просмотреть сгенерированный код в отражателе, но сборка появляется как пустое (что я знаю, что это не).
Есть идеи, почему это происходит?
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
Плагин для отражателя, который не помогает с этой проблемой.
Решение
Заменять:
var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name);
С участием:
var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, "yourfilename.dll");
Затем ищите его в вашем текущем каталоге, наверное, ваша папка Bin. Сборки и модули являются технически двумя отдельными объектами, и вы сохраняете только информацию об сборке, а не информацию модуля (где все ваши кодовые жизни). (Кроме того, не называйте их как с тем же именем, конечно.)