C# 在线程中运行 InvokeMember

标签 c# assemblies

所以我想做的是在线程中运行 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/

相关文章:

c# - 混合模式程序集是针对运行时版本 'v1.1.4322' 构建的,无法在 4.0 运行时中加载

c# - 如何使用 Reflection 或 Mono.Cecil 在已编译的程序集中搜索字符串?

web-applications - 在 Web 应用程序的页脚中显示底层软件的版本?

c# - 隐藏类型不在 .net 中的 Assembly.GetTypes 中列出

javascript - 从插件发送消息到表单不适用于空值

c# - 从列表中初始化嵌套对象

c# - 从指南列表生成确定性指南

c# - 使用正则表达式忽略带有数字的字符串中的日期

c# - C# 中的哪个函数类似于 VBA 中的 Mid() 函数?

c# - 将 DLL 加载到单独的 AppDomain 中