在 2015年8月24日星期一 UTC+8下午7:04:00,Sergiy Dubovik写道:
>
> Hi,
>
> I have a simple task to create a type and save it to dll.
>
> public static void WriteAType()
> {
> AssemblyNameDefinition name = new
> AssemblyNameDefinition("CecilAssembly", new Version(1, 0));
> AssemblyDefinition assembly =
> AssemblyDefinition.CreateAssembly(name, "CecilAssembly", ModuleKind.Dll);
> ModuleDefinition module =
> ModuleDefinition.CreateModule("myModule", ModuleKind.Dll);
> assembly.Modules.Add(module);
> TypeReference objectReference = module.Import(typeof (object));
> var met = objectReference.Resolve().Methods;
> TypeDefinition typeDef = new TypeDefinition("sample", "Main",
> TypeAttributes.Class | TypeAttributes.Public);
> AddEmptyConstructor(typeDef, met[0], module);
> TypeDefinition resolved = typeDef.Resolve();
> module.Types.Add(resolved);
> assembly.Write("CecilAssembly.dll");
> }
>
> private static void AddEmptyConstructor(TypeDefinition type,
> MethodReference baseEmptyConstructor, ModuleDefinition module)
> {
> const MethodAttributes methodAttributes =
> MethodAttributes.Public | MethodAttributes.HideBySig |
> MethodAttributes.SpecialName | MethodAttributes.RTSpecialName;
> var method = new MethodDefinition(".ctor", methodAttributes,
> module.TypeSystem.Void);
>
> method.Body.Instructions.Add(Instruction.Create(OpCodes.Ldarg_0));
> method.Body.Instructions.Add(Instruction.Create(OpCodes.Call,
> baseEmptyConstructor));
> method.Body.Instructions.Add(Instruction.Create(OpCodes.Ret));
> type.Methods.Add(method);
> }
>
> when I open ilSpy on CecilAssembly.dll I see empty one.
>
> I found one snippet where, one guy, creates a type and saves it to
> MainModule at AssemblyDefinition and actualy ilSpy shows content of that
> type.
> I modified code above a bit, here is a snippet:
>
> public static void ExploreCecilType()
> {
> AssemblyNameDefinition name = new
> AssemblyNameDefinition("mycecil", new Version(1, 0));
> AssemblyDefinition assembly =
> AssemblyDefinition.CreateAssembly(name, "myModule", ModuleKind.Console);
> ModuleDefinition module = assembly.MainModule;
> TypeReference objectRef = module.Import(typeof (object));
>
> TypeDefinition fooType = new TypeDefinition("", "Foo",
> TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AnsiClass |
> TypeAttributes.AutoClass, objectRef);
> module.Types.Add(fooType);
> AddEmptyConstructor(fooType, objectRef.Resolve().Methods[0],
> module);
> assembly.Write("mycecil.dll");
> }
>
> When I launch this, it gives me:
> Unhandled Exception: System.ArgumentException: Member 'System.Void
> System.Object
> ::.ctor()' is declared in another module and needs to be imported
>
> didn't I just import it with "TypeReference objectRef =
> module.Import(typeof (object));"?
>
> Is there a way to create a type and save it? Why modules are not saved
> when I create my own? How to reference a mscorlib?
>
> Thanks.
>
--
--
--
mono-cecil
---
You received this message because you are subscribed to the Google Groups
"mono-cecil" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.