c# - How to get a correct method reference when performing a JMP instruction to a method that resides in a different assembly -


i have following code creates dynamicassembly 2 types 1 public method each.

        var assembly = appdomain.currentdomain.definedynamicassembly                 (new assemblyname("testassembly"), assemblybuilderaccess.run);         var module = assembly.definedynamicmodule("main");         var type1 = module.definetype("type1");           var method1 = type1.definemethod                       (                         "method1", methodattributes.public, typeof(void), null                       );          var gen = method1.getilgenerator();         gen.emit(opcodes.ret);          var t1 = type1.createtype();          var createdmethod1 = t1.getmethod("method1");          var type2 = module.definetype("type2");          var method2 = type2.definemethod                       (                         "method2", methodattributes.public, typeof(void), null                       );           byte[] ilcodes = new byte[5];         ilcodes[0] = (byte)opcodes.jmp.value;         ilcodes[1] = (byte)(createdmethod1.metadatatoken & 0xff);         ilcodes[2] = (byte)(createdmethod1.metadatatoken >> 8 & 0xff);         ilcodes[3] = (byte)(createdmethod1.metadatatoken >> 16 & 0xff);         ilcodes[4] = (byte)(createdmethod1.metadatatoken >> 24 & 0xff);          method2.setmethodbody(ilcodes, ilcodes.length, null, null, null);           var obj = activator.createinstance(type2.createtype());          obj.gettype().getmethod("method2").invoke(obj, null); 

whenever make call type2.method2() have jmp instruction type1.method1().

this works charm, both types reside in same assembly.

now if want redirect type in assembly how can correct assembly/module reference in order jmp instruction succeed. if this:

        byte[] ilcodes = new byte[5];         ilcodes[0] = (byte)opcodes.jmp.value;         ilcodes[1] = (byte)(methodfromotherassembly.metadatatoken & 0xff);         ilcodes[2] = (byte)(methodfromotherassembly.metadatatoken >> 8 & 0xff);         ilcodes[3] = (byte)(methodfromotherassembly.metadatatoken >> 16 & 0xff);         ilcodes[4] = (byte)(methodfromotherassembly.metadatatoken >> 24 & 0xff); 

it keeps failing indexnotfound exception.

i want raw il byte instructions.

metadata tokens not globally unique. resolved in context of calling method's module. need use getmetadatatoken on module proper token. first example works because methods share same module.

this proper token dynamic module:

byte[] ilcodes = new byte[5]; int token = module.getmetadatatoken(methodfromotherassembly).token; ilcodes[0] = (byte)opcodes.jmp.value; ilcodes[1] = (byte)(token & 0xff); ilcodes[2] = (byte)(token >> 8 & 0xff); ilcodes[3] = (byte)(token >> 16 & 0xff); ilcodes[4] = (byte)(token >> 24 & 0xff); 

Comments

Popular posts from this blog

toolbar - How to add link to user registration inside toobar in admin joomla 3 custom component -

linux - disk space limitation when creating war file -