Reflection и Threading
От: PaiL Россия  
Дата: 07.03.07 07:50
Оценка:
Подскажите, пожалуйста, как можно выполнить метод из загруженной сборки в отдельном потоке?
Есть такой код:
1. string sAssembly = "c:\assemblies\assembly.dll";
2. string sType = "MyNamestapce.MyType";
3. string sMethodName = "PublicStaticParametrizedMethod";
4. Assembly asmDLL;
5. Thread thread1;
6. asmDLL = Assembly.LoadFile(sAssembly);
7. thread1 = new Thread(new ParameterizedThreadStart(asmDLL.GetType(sType).GetMethod(sMethodName)));

Компилятор ругается на седьмую строчку кода, говорит:
Method name expected
Re: Reflection и Threading
От: Lloyd Россия  
Дата: 07.03.07 08:00
Оценка: 1 (1) +1
Здравствуйте, PaiL, Вы писали:

PL>Компилятор ругается на седьмую строчку кода, говорит:

PL>Method name expected

thread1 = new Thread((ParameterizedThreadStart)Delegate.CreateDelegate(typeof(ParameterizedThreadStart), asmDLL.GetType(sType).GetMethod(sMethodName)));
Re: Reflection и Threading
От: migel  
Дата: 07.03.07 08:04
Оценка: 2 (1)
Здравствуйте, PaiL, Вы писали:

PL>Подскажите, пожалуйста, как можно выполнить метод из загруженной сборки в отдельном потоке?

PL>Есть такой код:
PL>
PL>1. string sAssembly = "c:\assemblies\assembly.dll";
PL>2. string sType = "MyNamestapce.MyType";
PL>3. string sMethodName = "PublicStaticParametrizedMethod";
PL>4. Assembly asmDLL;
PL>5. Thread thread1;
PL>6. asmDLL = Assembly.LoadFile(sAssembly);
PL>7. thread1 = new Thread(new ParameterizedThreadStart(asmDLL.GetType(sType).GetMethod(sMethodName)));
PL>

PL>Компилятор ругается на седьмую строчку кода, говорит:
PL>Method name expected
И правильно делает
Конструктор делегата ожидает MethodHandle а ты ему подсовывеш MethodInfo.
Сделай нормальный класс воркер.

class Worker
{
    private MethodInfo _method;
    private object[] _args;
    public Worker(MethodInfo mi, params object[] args)
    {
        _method = mi;
        _args = args;
    }
  
    public void Run()
    {
        _mi.Invoke(null, args);
    }
}

string sAssembly = "c:\assemblies\assembly.dll";
string sType = "MyNamestapce.MyType";
string sMethodName = "PublicStaticParametrizedMethod";
Assembly asmDLL;
Thread thread1;
asmDLL = Assembly.LoadFile(sAssembly);
Worker w = new Worker(asmDLL.GetType(sType).GetMethod(sMethodName), args);
thread1 = new Thread(new ThreadStart(w.Run));
... << RSDN@Home 1.2.0 alpha rev. 644>>
Re[2]: Reflection и Threading
От: Lloyd Россия  
Дата: 07.03.07 08:08
Оценка: 1 (1) +1
Здравствуйте, migel, Вы писали:

Ненужное переусложнение. Если уж хочется через рефлекшн, то можно вот так:
MethodInfo mi = asmDLL.GetType(sType).GetMethod(sMethodName);
thread1 = new Thread((ThreadStart)delegate{mi.Invoke(null, null);});
Re: Reflection и Threading
От: PaiL Россия  
Дата: 07.03.07 08:10
Оценка:
Всем большое спасибо!!!
Re[3]: Reflection и Threading
От: migel  
Дата: 07.03.07 08:18
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, migel, Вы писали:


L>Ненужное переусложнение. Если уж хочется через рефлекшн, то можно вот так:

L>
L>MethodInfo mi = asmDLL.GetType(sType).GetMethod(sMethodName);
L>thread1 = new Thread((ThreadStart)delegate{mi.Invoke(null, null);});
L>

По первости не нужное, а когда начинаються пляски с бубном по поводу несоотвествия параметров, их конвертации и прочее
воркер само то .
... << RSDN@Home 1.2.0 alpha rev. 644>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.