2

実行時にいくつかのアセンブリをロードし、Reflections(MethodInfo.Invoke)を使用してそれらのアセンブリにメソッドを呼び出しています。

ここで、これらの呼び出しを非同期にします。だから私はDelegate.BeginInvoke()を使うことを考えています。しかし、実行時に関数名を指定してデリゲートインスタンスを作成する方法がわかりません。(私が見るすべての例では、コンパイル時にデリゲートインスタンスターゲットが解決されています。)呼び出されるメソッドを含むMethodInfoオブジェクトがあります。これを行う方法はありますか?

   public void Invocation(Object[] inputObjs)
    {
        public delegate string DelegateMethodInfo(int num);

        Assembly assm = Assembly.Load(assemblyName);
        Type type = assm.GetType(className);
        Type[] ctorParams = new Type[0];
        Object[] objs = new Object[0];

        ConstructorInfo ctorInf = type.GetConstructor(ctorParams);
        Object classObj = ctorInf.Invoke(objs);
        MethodInfo methodInf = type.GetMethod(methodName);

        // Need asynchronous invocation.
        //Object retObj = methodInf.Invoke(classObj, inputObjs);

        DelegateMethodInfo del = new DelegateMethodInfo(???); // How to instantiate the delegate???
        del.BeginInvoke((int)inputObjs[0], null, null);
    }
4

4 に答える 4

4

-を使用できDelegate.CreateDelegateますが、作成する適切なタイプのデリゲートを取得するには、署名を知っている必要があります。基本的に:(を取得したばかりの場合、これは少し注意が必要です。MethodInfoさらに悪いことに、Delegate.DynamicInvoke非同期実行に相当するものはありません。

正直なところ、最も簡単なことは、メソッドを呼び出した新しいスレッドプールジョブを開始することです。

ThreadPool.QueueUserWorkItem(delegate { methodInf.Invoke(classObj, inputObjs);});
于 2009-11-04T19:39:21.680 に答える
2

methodInf.Invokeの呼び出しをラップするラムダ式を使用するだけです。結果のデリゲートはタイプDelegateMethodInfoです。

于 2009-11-04T19:40:33.550 に答える
1

これは他の回答と似ていますが、新しいものを作成してメソッドをFunc割り当てることができます。methodInf.Invokeこれが例です

class Other
{
    public void Stuff()
    { Console.WriteLine("stuff"); }
}

static void Main(string[] args)
{
    var constructor = typeof(Other).GetConstructor(new Type[0]);
    var obj = constructor.Invoke(null);

    var method = typeof(Other).GetMethods().First();
    Func<object, object[], object> delegate = method.Invoke;
    delegate.BeginInvoke(obj, null, null, null);

    Console.ReadLine();
}

Func<object, object[], object>実行しているのは、のシグニチャと一致するタイプの新しい変数を作成することですMethodInfo.Invoke。次に、オブジェクトの実際のinvokeメソッドへの参照を取得し、その参照を変数に固定します。

はデリゲートタイプであるためFunc<>、次を使用できますBeginInvoke

于 2009-11-04T19:47:24.793 に答える
0

MethodInvoker(クラスではなくデリゲート)を使用して、追加のデリゲートを作成しようとしないことを検討しましたか?これで匿名メソッドを使用することにより、必要なものを実行できる可能性があります。または私はクラックを吸っている可能性があります。ただし、基本的に、MethodInvokerは標準のパラメーターなしのデリゲートとして機能し、anonメソッドでは、パラメーターをMethodInvokerの匿名コードに渡します。WinFormsでこれを使用して、左右にデリゲートを作成せずにForm.BeginInvokeを実行しました。必要に応じて、お待ちいただければ、私に返信してください。今夜、サンプルコードをお届けします(私は米国西海岸にいます... GMT -8)。

于 2009-11-04T19:46:46.160 に答える