Используя .NET 4.7.2, я динамически генерирую .dll
во время выполнения, используя
internal class Program
{
private static void Main(string[] args)
{
AssemblyBuilder assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(new AssemblyName("MyAssembly"), AssemblyBuilderAccess.RunAndSave);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("ModuleName");
TypeBuilder typeBuilder = moduleBuilder.DefineType("MyNamespace.TypeName", TypeAttributes.Public);
typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);
// Build the method 'public int ReturnTheAnswer() => 42;'.
MethodBuilder newMethod = typeBuilder.DefineMethod("ReturnTheAnswer", MethodAttributes.Public, typeof(int), new Type[0]);
ILGenerator ilGen = newMethod.GetILGenerator();
ilGen.Emit(OpCodes.Ldc_I4_S, 42);
ilGen.Emit(OpCodes.Ret);
Type newType = typeBuilder.CreateType();
assemblyBuilder.Save("MyAssembly.dll"); // Save the assembly in the programs work directory ('bin\Debug').
dynamic o = Activator.CreateInstance(newType); // Create an instance of the dynamically created type.
int r = (int) o.ReturnTheAnswer();
Debug.Assert(r == 42); // If this doesn't fail, the type has been built correctly, is in fact in the .dll and can be used perfectly fine.
}
}
, и я могу прекрасно использовать тип в .dll
, однако, при просмотре сгенерированного .dll
с DotPeek и IL Spy, они оба не показывают никаких пространств имен или типов (хотя они должны показывать тип TypeName
в пространстве имен MyNamespace
).
Почему сборкакажется пустым при использовании двух разных декомпиляторов, но использование его типов из кода работает отлично?
(приведенный выше пример кода mvce, вы должны быть в состоянии воспроизвести точное поведение, с которым я сталкиваюсь)