所以我想做的是在线程中运行 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.
我做的事情完全错误吗?或者也许有人可以指出为什么我会遇到这个异常..
最佳答案
传奇的 foreach
捕获问题 - 当它开始调用它时(在不同的线程上),type
变量引用了不同的 Type
...
复制一份:
foreach (var tmp in types)
{
var type = tmp;
// your code
}
区别在于循环变量(在您的示例中为 type
,在我的示例中为 tmp
)的作用域外部(根据规范),因此出于捕获目的,它是整个循环通用的单个变量。但是,在我的示例中,type
的作用域位于循环内部,因此(出于捕获目的)每次迭代都会被视为不同的变量。
关于C# 在线程中运行 InvokeMember,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6595362/