-1

I want to modify enum type by mono cecil

before modify

public enum TestType : byte
{
    TestType1,
    TestType2,
    TestType3,
    TestType4,
}

after modify

public enum TestType : byte
{
    TestType1,
    TestType2,
    TestType3,
    AddTestType,
    TestType4,
}

Is it possible to modify the enum as above with mono cecil?

Please tell me the sample code.

1 Answers1

0

Yes, it is possible. You can use the following code as inspiration:

(which has been generated by https://cecilifier.me/?gistid=0dbc6d733aa4e09f07b332ba4f72c592)

using Mono.Cecil;
using Mono.Cecil.Cil;
using Mono.Cecil.Rocks;
using System; 
using System.Linq;
using BindingFlags = System.Reflection.BindingFlags;

using Cecilifier.Runtime;

public class SnippetRunner
{
    public static void Main(string[] args)
    {
        var assembly = AssemblyDefinition.CreateAssembly(new AssemblyNameDefinition("name", Version.Parse("1.0.0.0")), "moduleName", ModuleKind.Dll);
        var TestEnum1 = new TypeDefinition("", "TestEnum", TypeAttributes.Private | TypeAttributes.Sealed, assembly.MainModule.ImportReference(typeof(System.Enum)));
        assembly.MainModule.Types.Add(TestEnum1);
        var valueField_TestEnum = new FieldDefinition("value__", FieldAttributes.SpecialName | FieldAttributes.RTSpecialName | FieldAttributes.Public, assembly.MainModule.TypeSystem.Int32);
        TestEnum1.Fields.Add(valueField_TestEnum);
        var em_TestEnum_2_First = new FieldDefinition("First", FieldAttributes.Static | FieldAttributes.Literal | FieldAttributes.Public | FieldAttributes.HasDefault, TestEnum1) { Constant = 0 };
        TestEnum1.Fields.Add(em_TestEnum_2_First);
        var em_TestEnum_3_Second = new FieldDefinition("Second", FieldAttributes.Static | FieldAttributes.Literal | FieldAttributes.Public | FieldAttributes.HasDefault, TestEnum1) { Constant = 1 };
        TestEnum1.Fields.Add(em_TestEnum_3_Second);
        var em_TestEnum_4_Third = new FieldDefinition("Third", FieldAttributes.Static | FieldAttributes.Literal | FieldAttributes.Public | FieldAttributes.HasDefault, TestEnum1) { Constant = 2 };
        TestEnum1.Fields.Add(em_TestEnum_4_Third);
        var t1 = new TypeDefinition("", "C", TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit | TypeAttributes.NotPublic, assembly.MainModule.TypeSystem.Object);
        assembly.MainModule.Types.Add(t1);
        t1.BaseType = assembly.MainModule.TypeSystem.Object;
        var C_ctor_ = new MethodDefinition(".ctor", MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.RTSpecialName | MethodAttributes.SpecialName, assembly.MainModule.TypeSystem.Void);
        t1.Methods.Add(C_ctor_);
        var il5 = C_ctor_.Body.GetILProcessor();
        var Ldarg_06 = il5.Create(OpCodes.Ldarg_0);
        il5.Append(Ldarg_06);
        var Call7 = il5.Create(OpCodes.Call, assembly.MainModule.ImportReference(TypeHelpers.DefaultCtorFor(t1.BaseType)));
        il5.Append(Call7);
        var Ret8 = il5.Create(OpCodes.Ret);
        il5.Append(Ret8);

        var C_Foo_testenum = new MethodDefinition("Foo", MethodAttributes.Private | MethodAttributes.HideBySig, assembly.MainModule.TypeSystem.Void);
        t1.Methods.Add(C_Foo_testenum);
        var il_C_Foo_testenum = C_Foo_testenum.Body.GetILProcessor();
        var t9 = new ParameterDefinition("t", ParameterAttributes.None, TestEnum1);
        C_Foo_testenum.Parameters.Add(t9);
        var Ret10 = il_C_Foo_testenum.Create(OpCodes.Ret);
        il_C_Foo_testenum.Append(Ret10);

        assembly.Write(args[0]);
    }
}
Vagaus
  • 4,174
  • 20
  • 31