所以我尝试做的是在一个线程中运行InvokeMember。在此处获取了如何操作的信息:C# : Invoke a method with [Type].InvokeMember() in a separate Thread
所以我的代码现在看起来像这样,这有效:
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.
我做错了什么或者有人可以指出为什么我会得到这个例外..
答案 0 :(得分:3)
传奇的foreach
捕获问题 - 当它调用它时(在不同的线程上),type
变量引用不同的Type
...
改为复制:
foreach (var tmp in types)
{
var type = tmp;
// your code
}
不同之处在于循环变量(示例中为type
,我的tmp
)的范围在循环外(根据规范),因此用于捕获目的是它是整个循环共有的单变量。但是,我的示例中的type
在循环中作为范围,因此(出于捕获目的)每次迭代都被视为不同的变量。