C#在线程中运行InvokeMember

C#在线程中运行InvokeMember,c#,assemblies,C#,Assemblies,所以我要做的是在线程中运行InvokeMember。在此处获得了如何操作的信息: 因此,我的代码现在看起来像这样,这是可行的: Assembly OCA = Assembly.LoadFrom("./CardMax2.Elkart.OrderClutchAgent.dll"); Type[] types = OCA.GetTypes(); foreach (var type in types) {

所以我要做的是在线程中运行InvokeMember。在此处获得了如何操作的信息:

因此,我的代码现在看起来像这样,这是可行的:

            Assembly OCA = Assembly.LoadFrom("./CardMax2.Elkart.OrderClutchAgent.dll");
            Type[] types = OCA.GetTypes();
            foreach (var type in types)
            {
                //MethodInfo[] methods = type.GetMethods();
                if (type.Name == "OrderClutchAgent")
                {
                    var obj = Activator.CreateInstance(type);
                    type.InvokeMember("RunAgent",BindingFlags.Default | BindingFlags.InvokeMethod,null,obj,null);
                }

            }
现在,当我尝试在线程中运行它时,代码如下所示:

            Assembly OCA = Assembly.LoadFrom("./CardMax2.Elkart.OrderClutchAgent.dll");
            Type[] types = OCA.GetTypes();
            foreach (var type in types)
            {
                //MethodInfo[] methods = type.GetMethods();
                if (type.Name == "OrderClutchAgent")
                {
                    var obj = Activator.CreateInstance(type);
                    Thread t = new Thread(delegate()
                                              {
                                                  type.InvokeMember("RunAgent", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, null);
                                              });
                    t.Start();
                }

            }
但有了这段代码,我得到了一个奇怪的例外:

Method 'Org.BouncyCastle.Asn1.X509.TbsCertificateList+RevokedCertificatesEnumeration+RevokedCertificatesEnumerator.RunAgent' not found.

我是否做了一些完全错误的事情,或者也许有人可以指出我为什么会出现这种异常。

传奇的
foreach
捕获问题-当它开始调用它时(在不同的线程上),
type
变量引用了不同的
类型

制作一份副本:

foreach (var tmp in types)
{
    var type = tmp;
    // your code
}

不同之处在于循环变量(
type
在您的示例中,我的示例中是
tmp
)的作用域在循环之外(根据规范),因此出于捕获目的,它是整个循环共用的单变量。但是,在我的示例中,
type
的作用域在循环内部,因此(为了捕获目的)在每次迭代中被视为不同的变量。

也许您可以在第二个线程上调用整个代码块,而不是单个方法调用。