C# : Invoke a method with [Type].InvokeMember() in a separate Thread

前端 未结 2 1725
甜味超标
甜味超标 2021-01-12 14:37

I am using this code where I am invoking the run method of a List of classes that I loaded dynamically from dlls:

for (int i = 0; i < robotLi         


        
相关标签:
2条回答
  • 2021-01-12 15:12

    Have a look at this sample for one way of doing it:

    using System;
    using System.Threading;
    using System.Reflection;
    using System.Collections.Generic;
    
    namespace Obfuscation
    {
        public class Program
        {
            static Type[] robotArray = new Type[] { typeof(Program) };
            static List<Type> robotList = new List<Type>(robotArray);
    
            internal void Run()
            {
                Console.WriteLine("Do stuff here");
            }
    
            internal static void RunInstance(object threadParam)
            {
                Type t = (Type)threadParam;
                object o = Activator.CreateInstance((Type)t);
                t.InvokeMember("Run", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, null, o, null);
            }
    
            public static void Main(string[] args)
            {
                for (int i = 0; i < robotList.Count; i++)
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(RunInstance), robotList[i]);
                }
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-12 15:28

    If you know that all your dynamically loaded types implement Run, could you just require they all implement IRunable and get rid of the reflection part?

    Type t = robotList[i];
    IRunable o = Activator.CreateInstance(t) as IRunable;
    if (o != null)
    {
        o.Run(); //do this in another thread of course, see below
    }
    

    If not, this will work:

    for (int i = 0; i < robotList.Count; i++)
    {
        Type t = robotList[i];
        object o = Activator.CreateInstance(t);
        Thread thread = new Thread(delegate()
        {
            t.InvokeMember("Run", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, null);
        });
        thread.Start();
    }
    
    0 讨论(0)
提交回复
热议问题