TypeBuilder
で自分のタイプを構築していますが、別のオブジェクトから集めたmethodInfo
を呼び出すこのメソッドに追加しようとしています。他のメソッドをIlGeneratorで呼び出す
問題は、ILGenerator.Emit
またはILGenerator.EmitCall
の使用方法がわかりません。
il.EmitCall(OpCodes.Call, methodInfo, arguments)
とil.Emit(OpCodes.Call, methodInfo)
を使用しようとしましたが、どちらも機能しませんでした。常に私は、このエラーました:
[InvalidProgramException: Common Language Runtime detected an invalid program.]
MyImplementationController.Hello1() +0
[TargetInvocationException: Exception has been thrown by the target of an invocation.]
System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0
System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) +192
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +155
System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) +19
をそして、これは私のコードです:
foreach (var methodInfo in methodInfosFromSomewhere)
{
var arguments = methodInfo.GetParameters().Select(a => a.ParameterType).ToArray();
MethodBuilder mb = tb.DefineMethod(
methodInfo.Name,
MethodAttributes.Final | MethodAttributes.Public,
CallingConventions.HasThis,
methodInfo.ReturnType,
arguments);
// method
ILGenerator il = mb.GetILGenerator();
int numParams = arguments.Length;
for (byte x = 0; x < numParams; x++)
{
//il.Emit(OpCodes.Ldarg_S, x);
il.Emit(OpCodes.Ldstr, x);
}
//il.EmitCall(OpCodes.Call, methodInfo, arguments);
il.Emit(OpCodes.Call, methodInfo);
il.Emit(OpCodes.Ret);
}
@Edit
をどこに問題がある。最後に、私は(おそらく)を知っています!私がEmit.Call
と呼ぶとき、私はこのオブジェクトのメソッドを呼びたくありません。メソッドを別のオブジェクトから呼び出す必要があります。
この例を見てみてください:
// this is interface that we want to 'decorate'
public interface IMyInterface
{
MyResponse Hello1();
MyResponse Hello2(MyRequest request);
MyResponse Hello3(MyRequest request);
}
public class MyImplementation : IMyInterface
{
public MyResponse Hello1()
{
return new MyResponse { Name = "empty" };
}
// ... rest of implementation, it doesn't matter
}
私が生成するクラスがそのようsmthingされています。あなたは私が他のオブジェクトからメソッドを呼び出したい見ることができるように
public class GeneratedClass : ApiController
{
public MyInterface myImplementation { get; set; }
public MyResponse Hello1()
{
return myImplementation.Hello1();
}
// ... rest of implementation, it doesn't matter
}
。私は、オブジェクトのプロパティを作成する方法を知っているが、私はソースから他のオブジェクト
命令は、引数ではなく、バイトとして文字列を期待しています。 –
メソッドの引数型を事前に知っていますか?完全に動的な方法で呼び出しを生成することは、かすかな心のためではありません。各パラメーターをロードするための正しい(型に安全な)コードを発行する必要があります。 –
保存されているところに '' 'MethodInfo'''があります。私は何も知らない – MAGx2