книга по Reflection.Emit и модификация классов на лету
От: 4D man Россия  
Дата: 16.06.03 09:17
Оценка:
У меня возникла такая проблема: существует класс, который в процессе работы программы должен постоянно модифицироваться: функции должны заменяться, удаляться и создаваться. Т.е. допустим у меня в этом классе есть функция
double f(double[] args)
{
return 2*args[0];
}
и в процессе работы программы мне нужно её заменить на такую же, только выполняющую
return args[0]+5;
Как такое можно сделать? Пробовал приводить класс к типу TypeBuilder и потом определять в нем метод — получается ерунда.

З.Ы.: Пытался искать книги специально по Reflection.Emit — не нашел, везде на него больше пары глав не выделяется.... Может кто знает хорошую книжку по нему? MSDN конечно вещь хорошая, но с книжкой, тем более на русском, было бы гораздо удобнее....
Re: книга по Reflection.Emit и модификация классов на лету
От: Miem Россия  
Дата: 16.06.03 09:32
Оценка:
Здравствуйте, 4D man, Вы писали:

4M>У меня возникла такая проблема: существует класс, который в процессе работы программы должен постоянно модифицироваться: функции должны заменяться, удаляться и создаваться. Т.е. допустим у меня в этом классе есть функция


Типы с помощью Reflection метять (добавлять/удалять/подменять методы/поля) нельзя. Можно только создавать новые типы. При желании наследоваться от старых
ICQ: 446240
Re[2]: книга по Reflection.Emit и модификация классов на лет
От: 4D man Россия  
Дата: 16.06.03 10:20
Оценка:
Здравствуйте, Miem, Вы писали:

M>Здравствуйте, 4D man, Вы писали:


4M>>У меня возникла такая проблема: существует класс, который в процессе работы программы должен постоянно модифицироваться: функции должны заменяться, удаляться и создаваться. Т.е. допустим у меня в этом классе есть функция


M>Типы с помощью Reflection метять (добавлять/удалять/подменять методы/поля) нельзя. Можно только создавать новые типы. При желании наследоваться от старых

Тогда напрашивается вообще глупый вопрос: а вообще это можно как-то сделать, т.е. сделать так, чтобы класс динамически менялся.
Или, как я понял, после tb.CreateType(); с типом уже ничего не сделаешь?
Re: книга по Reflection.Emit и модификация классов на лету
От: Lloyd Россия  
Дата: 16.06.03 10:30
Оценка:
Здравствуйте, 4D man, Вы писали:

4M>У меня возникла такая проблема: существует класс, который в процессе работы программы должен постоянно модифицироваться: функции должны заменяться, удаляться и создаваться. Т.е. допустим у меня в этом классе есть функция

4M>double f(double[] args)
4M>{
4M> return 2*args[0];
4M>}
4M>и в процессе работы программы мне нужно её заменить на такую же, только выполняющую
4M> return args[0]+5;
4M>Как такое можно сделать? Пробовал приводить класс к типу TypeBuilder и потом определять в нем метод — получается ерунда.

Интерфейс класса должен менятся или нет? Или должна менятся только его реализация?
Re[3]: книга по Reflection.Emit и модификация классов на лет
От: Miem Россия  
Дата: 16.06.03 10:33
Оценка:
Здравствуйте, 4D man, Вы писали:

4M>Или, как я понял, после tb.CreateType(); с типом уже ничего не сделаешь?


ничего, ну разве что отнаследоваться от него и перегрузить методы
ICQ: 446240
Re[3]: книга по Reflection.Emit и модификация классов на лет
От: Ведмедь Россия  
Дата: 16.06.03 10:45
Оценка:
Здравствуйте, 4D man, Вы писали:

4M>Здравствуйте, Miem, Вы писали:


M>>Здравствуйте, 4D man, Вы писали:


4M>>>У меня возникла такая проблема: существует класс, который в процессе работы программы должен постоянно модифицироваться: функции должны заменяться, удаляться и создаваться. Т.е. допустим у меня в этом классе есть функция


M>>Типы с помощью Reflection метять (добавлять/удалять/подменять методы/поля) нельзя. Можно только создавать новые типы. При желании наследоваться от старых

4M>Тогда напрашивается вообще глупый вопрос: а вообще это можно как-то сделать, т.е. сделать так, чтобы класс динамически менялся.
4M>Или, как я понял, после tb.CreateType(); с типом уже ничего не сделаешь?

А почему ты не хочешь сделать по другому? ЧТо бы класс не менялся, но он вызывал другой класс, который рулил бы какой класс ему возвращять ? НА мой взгляд здесь фабрика классов рулит по полной программе.
Да пребудет с тобой Великий Джа
Re[4]: книга по Reflection.Emit и модификация классов на лет
От: 4D man Россия  
Дата: 16.06.03 15:15
Оценка:
Здравствуйте, Miem, Вы писали:

M>Здравствуйте, 4D man, Вы писали:


4M>>Или, как я понял, после tb.CreateType(); с типом уже ничего не сделаешь?


M>ничего, ну разве что отнаследоваться от него и перегрузить методы

Я пробовал так делать. Только вот класс меняется достаточно часто, поэтому появляются многочисленные наследования, зачастую меняющие лишь один член класса. В итоге произоводительность сильно падает...
Re[2]: книга по Reflection.Emit и модификация классов на лет
От: 4D man Россия  
Дата: 16.06.03 15:15
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


4M>>У меня возникла такая проблема: существует класс, который в процессе работы программы должен постоянно модифицироваться: функции должны заменяться, удаляться и создаваться. Т.е. допустим у меня в этом классе есть функция

4M>>double f(double[] args)
4M>>{
4M>> return 2*args[0];
4M>>}
4M>>и в процессе работы программы мне нужно её заменить на такую же, только выполняющую
4M>> return args[0]+5;
4M>>Как такое можно сделать? Пробовал приводить класс к типу TypeBuilder и потом определять в нем метод — получается ерунда.

L>Интерфейс класса должен менятся или нет? Или должна менятся только его реализация?

В классе всегда одна функция, у неё меняется только реализация, и ещё постоянно добавляются/убираются/модифицируются однотипнюе функции типа
double _имя функции_(double[] args)

У них меняются только название и код, которые вводятся пользователем.
Вот, собственно, и весь интерфейс класса.
Re[3]: книга по Reflection.Emit и модификация классов на лет
От: Banch  
Дата: 16.06.03 16:14
Оценка:
можно сделать так:

— собираешь код просто как текст в один файл .cs
— компилишь его
— загружаешь ассемблю в отдельный домен
— юзаешь ее
— выгружаешь
делаешь все снова

главное минимизировать междоменный обмен данными, чтобы как можно меньше тормозило
т.е. придется основной алгоритм, который юзает ту функцию, вынести в отдельную ассемблю и загружать ее в том же отдельном домене
Re[4]: книга по Reflection.Emit и модификация классов на лет
От: mihailik Украина  
Дата: 17.06.03 15:28
Оценка:
B> — собираешь код просто как текст в один файл .cs
B> — компилишь его

<skip>

B>главное минимизировать междоменный обмен данными, чтобы как можно меньше тормозило


Фигня. Тормозить будет компиляция C#. Там при каждой компиляции запускается отдельный процесс csc.exe, куда там междоменному обмену до таких тормозов!
... << RSDN@Home 1.0 beta 7a >>
Re[3]: книга по Reflection.Emit и модификация классов на лет
От: mihailik Украина  
Дата: 17.06.03 15:28
Оценка:
4M>Тогда напрашивается вообще глупый вопрос: а вообще это можно как-то сделать, т.е. сделать так, чтобы класс динамически менялся.
4M>Или, как я понял, после tb.CreateType(); с типом уже ничего не сделаешь?

Посмотри System.Reflection.Emit.MethodRental. Кажется, это то, что тебе нужно.
... << RSDN@Home 1.0 beta 7a >>
Re[5]: книга по Reflection.Emit и модификация классов на лет
От: Banch  
Дата: 17.06.03 16:33
Оценка:
M>Фигня. Тормозить будет компиляция C#. Там при каждой компиляции запускается отдельный процесс csc.exe, куда там междоменному обмену до таких тормозов!

я думал один раз скомпилить код, потом юзать его долго в каком то страшном алгоритме
Re[6]: книга по Reflection.Emit и модификация классов на лет
От: mihailik Украина  
Дата: 17.06.03 16:44
Оценка:
M>Фигня. Тормозить будет компиляция C#. Там при каждой компиляции запускается отдельный процесс csc.exe, куда там междоменному обмену до таких тормозов!

B>я думал один раз скомпилить код, потом юзать его долго в каком то страшном алгоритме


Тогда конечно. Но по сути задачи, вроде бы, код будет меняться нередко.

Кстати, грузить скомпилированную сборку вполне можно и прямо в текущий домен.
... << RSDN@Home 1.0 beta 7a >>
Re[7]: книга по Reflection.Emit и модификация классов на лет
От: Banch  
Дата: 17.06.03 17:28
Оценка:
M>Кстати, грузить скомпилированную сборку вполне можно и прямо в текущий домен.

да, но если грузить в отдельный то ее потом можно будет выгрузить
Re[8]: книга по Reflection.Emit и модификация классов на лет
От: Miem Россия  
Дата: 17.06.03 17:34
Оценка: 1 (1)
Здравствуйте, Banch, Вы писали:

M>>Кстати, грузить скомпилированную сборку вполне можно и прямо в текущий домен.


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


Экстремалы, блин Да у парня просто проблемы с архитектурой, а вы тут такие темы задвигаете . И правильно ему посоветовал Ведмедь про фабрику классов или еще там чего, но только не так...
... << RSDN@Home 1.0 beta 7 >>
ICQ: 446240
Re[4]: книга по Reflection.Emit и модификация классов на лет
От: 4D man Россия  
Дата: 18.06.03 08:52
Оценка:
Здравствуйте, Ведмедь, Вы писали:

В>А почему ты не хочешь сделать по другому? ЧТо бы класс не менялся, но он вызывал другой класс, который рулил бы какой класс ему возвращять ? НА мой взгляд здесь фабрика классов рулит по полной программе.


Т.е.? В смысле "рулил бы какой класс ему возвращять"? Нельзя ли поподробнее? А то я не очень понял что Вы имеете ввиду.
Re[5]: книга по Reflection.Emit и модификация классов на лет
От: Аноним  
Дата: 18.06.03 09:34
Оценка:
Здравствуйте, 4D man, Вы писали:

4M>Здравствуйте, Miem, Вы писали:


M>>Здравствуйте, 4D man, Вы писали:


4M>>>Или, как я понял, после tb.CreateType(); с типом уже ничего не сделаешь?


M>>ничего, ну разве что отнаследоваться от него и перегрузить методы

4M>Я пробовал так делать. Только вот класс меняется достаточно часто, поэтому появляются многочисленные наследования, зачастую меняющие лишь один член класса. В итоге произоводительность сильно падает...

а может здесь не фабрика нужна а декоратор ??
Re[5]: книга по Reflection.Emit и модификация классов на лет
От: Ведмедь Россия  
Дата: 18.06.03 09:52
Оценка:
Здравствуйте, 4D man, Вы писали:


4M>Т.е.? В смысле "рулил бы какой класс ему возвращять"? Нельзя ли поподробнее? А то я не очень понял что Вы имеете ввиду.


На первый взгляд видится так:


public abstract class Evalution
{
    public abstract double Eval( double[] args );
}

public void InvokeEvalution
{
    protected Evalution _evalution = null;
    public double Invoke( double[] args )
   {
      if( _evalution == null )
        throw new Exception("выражение не задано");
      return _evalution.Eval( args );
   }
   public Evalution Eval
  {
     set
    {
      evalution = val;
    }
  }
}



А дальше соотвесвенно где-то в коде


{
    InvokeEvalution invoke_evalution = new InvokeEvalution();
    invoke_evalution.Eval = CreateEvalution( code_source );// Функция, которая создает класс производный от Evalution c переопреденным методом Eval, в котором реализован нужный код.

    for( int i = 0 ; i < 100000; i++ )
   {
      Console.WriteLine( "result = {0}",invoke_evalution.Invoke( 1.0, 2.1, 3.2 ) );
   }
}

Я правильно понял это имелось ввиду?
Да пребудет с тобой Великий Джа
Re[6]: книга по Reflection.Emit и модификация классов на лет
От: 4D man Россия  
Дата: 18.06.03 11:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>а может здесь не фабрика нужна а декоратор ??

Не-а, кого здесь "оформлять"? Методы, которые нужно заменить?
Re[6]: книга по Reflection.Emit и модификация классов на лет
От: 4D man Россия  
Дата: 18.06.03 13:10
Оценка:
Здравствуйте, Ведмедь, Вы писали:

В>Здравствуйте, 4D man, Вы писали:



4M>>Т.е.? В смысле "рулил бы какой класс ему возвращять"? Нельзя ли поподробнее? А то я не очень понял что Вы имеете ввиду.


В>На первый взгляд видится так:

<>
В>Я правильно понял это имелось ввиду?
Почти. Спасибо за написаный код. Только вот помимо метода Eval
в class Evalution в нём(этом классе) будут ещё функции которые
мне нужно будет менять. Из кода же я понял, что Вы предлагаете
при каждом изменении набора функций заново создавать производный
от Evalution класс с перегруженными функциями. Я же имел ввиду
один раз создать тип класса, а потом только менять его содержимое.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.