Здравствуйте, Dax, Вы писали:
Dax>Здравствуйте, Serginio1, Вы писали:
S>> Считаешь, что mi вернет не прямой адрес, а ссылку на VMT ????
Dax>Естественно, метод же виртуальный.
Dax>С FieldInfo тоже облом — не отдает .NET fieldInfo на _target. Dax>Я ж говорю: по честному никак не получится, а хак, он и в Африке на следующей версии .NET прекратит работу.
Не должны быть еще хитрые методы. Извини, если не в лом посмотри из своих классов
можно ли через fieldInfo на приватные поля влиять. У меня сейчас Нет Net, а очень интересно.
и солнце б утром не вставало, когда бы не было меня
S> Не должны быть еще хитрые методы. Извини, если не в лом посмотри из своих классов S>можно ли через fieldInfo на приватные поля влиять. У меня сейчас Нет Net, а очень интересно.
На свои влиять можно (в смысле своих классов). А наследник от System.Delegate _target уже не видит.
Здравствуйте, Dax, Вы писали:
S>> Не должны быть еще хитрые методы. Извини, если не в лом посмотри из своих классов S>>можно ли через fieldInfo на приватные поля влиять. У меня сейчас Нет Net, а очень интересно.
Dax>На свои влиять можно (в смысле своих классов). А наследник от System.Delegate _target уже не видит.
Спасибо. Борцы хреновы. Унсейф . А через рефакторинг _target видно???
и солнце б утром не вставало, когда бы не было меня
S> Спасибо. Борцы хреновы. Унсейф . А через рефакторинг _target видно???
Через reflection видно. Ты был на половину прав
Короче, _target меняется следющим образом:
//public delegate void MethodDelegate();
//
A a = new A();
Delegate am = Delegate.CreateDelegate(typeof(MethodDelegate), a, "Method");
FieldInfo d = am.GetType().BaseType.BaseType.GetField("_target", BindingFlags.Instance | BindingFlags.NonPublic);
d.SetValue(am, this);
am.DynamicInvoke(null);
самое смешное, что все нормально работает, _target меняется, но! вызывается свой же метод, а не "деда".
Здравствуйте, Dax, Вы писали:
S>> Спасибо. Борцы хреновы. Унсейф . А через рефакторинг _target видно???
Dax>Через reflection видно. Ты был на половину прав
Dax>Короче, _target меняется следющим образом:
Dax>
Dax>//
Dax>public delegate void MethodDelegate();
Dax>//
Dax>A a = new A();
Dax>Delegate am = Delegate.CreateDelegate(typeof(MethodDelegate), a, "Method");
Dax>FieldInfo d = am.GetType().BaseType.BaseType.GetField("_target", BindingFlags.Instance | BindingFlags.NonPublic);
Dax>d.SetValue(am, this);
Dax>am.DynamicInvoke(null);
Dax>
Dax>самое смешное, что все нормально работает, _target меняется, но! вызывается свой же метод, а не "деда".
А ты без DynamicInvoke
delegate void procedureWithOutParameters();
Слава Dax. Еще проще чем в Delphi. Dax>Без DynamicInvoke все ok. (c) Пушкин
Dax>Дед вызывается. Не знаю на сколько это функционально в пределах нормального приложения, но простые тесты показывают, что метод вызывается.
А куда он денется. Делегату по барабану, что у него в полях содержится, тупо загоняет параметры и Call по адресу.
А при DynamicInvoke он уже отображение подключает и не работает на прямую.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Dax, Вы писали:
Dax>Здравствуйте, Serginio1, Вы писали:
S>>А ты без DynamicInvoke
Dax>Без DynamicInvoke все ok. (c) Пушкин
Dax>Дед вызывается. Не знаю на сколько это функционально в пределах нормального приложения, но простые тесты показывают, что метод вызывается.
Тыы бы полный код привел, а я тебе большую оценочку поставил.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Dax, Вы писали:
Dax>>Здравствуйте, Serginio1, Вы писали:
S>>>Через рефлектор или CreateDelegate найти адрес метода и вствить его в соответствующее поля делегата, а на место ссылки на объект this.
Dax>>Не выйдет. Dax>>Делегат — не адрес метода, он намертво с объектом-владельцем метода связан. А как раз-таки ссылку на "объект-дедушку" вычислить не получится. Боюсь, что в VTBL текущего обекта даже упоминания нет про "дедушкин" метод. Такое пройдет только со статическим методом или если "дед" сам такой делегат вернет. S> Почему же, делегат как раз имеет списочную структуру типа TMethod. А вот как выдернуть ссылку на дедушкин метод это другая проблема. Если это не абстрактный класс или через неабстрактного наследника не перекрывающего этот метод адрес выдернуть метода выдернуть можно просто создав объект этого типа создать делегат с его методом и заменить ссылку на объект на this.
Кстати, через MethodInfo.MethodHandle.GetFunctionPointer(); можно вытащить любой метод типа и соответственно заполнив структур делегата все сделать и без создания дедушкиного объекта.
и солнце б утром не вставало, когда бы не было меня