Slide 26
Slide 26 text
ILGenerator generator = methodBuilder.GetILGenerator();
generator.DeclareLocal(typeof(object[]));
// Get Context and peer
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldfld, contextField); // context
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldfld, targetPeerField); // peer
// OpCode
var opCode = methodInfo.GetCustomAttribute().OperationCode;
generator.Emit(OpCodes.Ldc_I4, (int)opCode);
// new[]{ }
generator.Emit(OpCodes.Ldc_I4, parameters.Length);
generator.Emit(OpCodes.Newarr, typeof(object));
generator.Emit(OpCodes.Stloc_0);
// object[]
for (var i = 0; i < paramTypes.Length; i++)
{
generator.Emit(OpCodes.Ldloc_0);
generator.Emit(OpCodes.Ldc_I4, i);
generator.Emit(OpCodes.Ldarg, i + 1);
generator.Emit(OpCodes.Box, paramTypes[i]);
generator.Emit(OpCodes.Stelem_Ref);
}
// Call method
generator.Emit(OpCodes.Ldloc_0);
generator.Emit(OpCodes.Callvirt, invokeMethod);
generator.Emit(OpCodes.Ret);
.SendOperationRequestAsync(peer, methodOpCode: 0, arguments: new object[] { 1, 10 })
ハイパーIL手書きマン