Re[14]: Неужели на C# такое не сделать???
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.12.03 14:58
Оценка:
Здравствуйте, Dax, Вы писали:

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


S>> Считаешь, что mi вернет не прямой адрес, а ссылку на VMT ????


Dax>Естественно, метод же виртуальный.


Dax>С FieldInfo тоже облом — не отдает .NET fieldInfo на _target.

Dax>Я ж говорю: по честному никак не получится, а хак, он и в Африке на следующей версии .NET прекратит работу.

Не должны быть еще хитрые методы. Извини, если не в лом посмотри из своих классов
можно ли через fieldInfo на приватные поля влиять. У меня сейчас Нет Net, а очень интересно.
и солнце б утром не вставало, когда бы не было меня
Re[15]: Неужели на C# такое не сделать???
От: Dax  
Дата: 11.12.03 15:05
Оценка:
S> Не должны быть еще хитрые методы. Извини, если не в лом посмотри из своих классов
S>можно ли через fieldInfo на приватные поля влиять. У меня сейчас Нет Net, а очень интересно.

На свои влиять можно (в смысле своих классов). А наследник от System.Delegate _target уже не видит.
Re[16]: Неужели на C# такое не сделать???
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.12.03 15:12
Оценка:
Здравствуйте, Dax, Вы писали:

S>> Не должны быть еще хитрые методы. Извини, если не в лом посмотри из своих классов

S>>можно ли через fieldInfo на приватные поля влиять. У меня сейчас Нет Net, а очень интересно.

Dax>На свои влиять можно (в смысле своих классов). А наследник от System.Delegate _target уже не видит.


Спасибо. Борцы хреновы. Унсейф . А через рефакторинг _target видно???
и солнце б утром не вставало, когда бы не было меня
Re[17]: Неужели на C# такое не сделать???
От: Dax  
Дата: 11.12.03 15:49
Оценка:
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 меняется, но! вызывается свой же метод, а не "деда".
Re[18]: Неужели на C# такое не сделать???
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.12.03 16:06
Оценка:
Здравствуйте, 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();

procedureWithOutParameters am=(procedureWithOutParameters) Delegate.CreateDelegate(typeof(procedureWithOutParameters),a,"Method");

FieldInfo d = am.GetType().BaseType.BaseType.GetField("_target", BindingFlags.Instance | BindingFlags.NonPublic);
d.SetValue(am, this);

am();

http://www.rsdn.ru/Forum/Message.aspx?mid=395620&only=1
Автор: Serginio1
Дата: 29.09.03
и солнце б утром не вставало, когда бы не было меня
Re[19]: Mожно. Но нужно ли?
От: Dax  
Дата: 11.12.03 16:26
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>А ты без DynamicInvoke


Без DynamicInvoke все ok. (c) Пушкин

Дед вызывается. Не знаю на сколько это функционально в пределах нормального приложения, но простые тесты показывают, что метод вызывается.
Re[20]: Mожно. Но нужно ли?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.12.03 16:36
Оценка:
Здравствуйте, Dax, Вы писали:

Слава Dax. Еще проще чем в Delphi.
Dax>Без DynamicInvoke все ok. (c) Пушкин

Dax>Дед вызывается. Не знаю на сколько это функционально в пределах нормального приложения, но простые тесты показывают, что метод вызывается.


А куда он денется. Делегату по барабану, что у него в полях содержится, тупо загоняет параметры и Call по адресу.
А при DynamicInvoke он уже отображение подключает и не работает на прямую.
и солнце б утром не вставало, когда бы не было меня
Re[20]: Mожно. Но нужно ли?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.12.03 16:37
Оценка:
Здравствуйте, Dax, Вы писали:

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


S>>А ты без DynamicInvoke


Dax>Без DynamicInvoke все ok. (c) Пушкин


Dax>Дед вызывается. Не знаю на сколько это функционально в пределах нормального приложения, но простые тесты показывают, что метод вызывается.


Тыы бы полный код привел, а я тебе большую оценочку поставил.
и солнце б утром не вставало, когда бы не было меня
Re[21]: Mожно. Но нужно ли?
От: Dax  
Дата: 11.12.03 16:43
Оценка: 78 (7)
Здравствуйте, Serginio1, Вы писали:

S> Тыы бы полный код привел, а я тебе большую оценочку поставил.



using System;
using System.Reflection;

namespace ConsoleApplication1 {

    class Class1 {

        [STAThread]
        static void Main(string[] args) {
            new C().Test();
            Console.ReadLine();
        }
    }

    public delegate void MD();

    class A {
        protected virtual void M() {
            Console.WriteLine("A.M");
        }
    }

    class B:A {
        protected override void M() {
            Console.WriteLine("B.M");
        }
    }

    class C:B {
        protected override void M() {
            Console.WriteLine("C.M");
        }
        public void Test() {
            A a = new A();
            MD am = (MD)Delegate.CreateDelegate(typeof(MD), a, "M");
            am.GetType().BaseType.BaseType.GetField("_target", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(am, this);
            am();
        }

    }


}
Re[20]: Mожно. Но нужно ли?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.12.03 16:50
Оценка:
Здравствуйте, Dax, Вы писали:

Всякое бывает. Ради спортивного интереса.
Решение есть и на душе приятно. Всяко лучше чем конфигурирование в 1С
и солнце б утром не вставало, когда бы не было меня
Re[22]: Mожно. Но нужно ли?
От: Алексей Одинцов Россия  
Дата: 12.12.03 07:44
Оценка:
Здравствуйте, Dax, Вы писали:

прикололо — у меня в примере в точности те же названия функций и делегата только c BaseType.BaseType недотумкался взять.
Re[22]: Mожно. Но нужно ли?
От: IvanM Россия  
Дата: 12.12.03 14:41
Оценка:
Здравствуйте, Dax, Вы писали:

Dax>...


Офигенно! Чего только люди ни придумают
Re[4]: Неужели на C# такое не сделать???
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 05.01.04 11:08
Оценка:
Здравствуйте, Serginio1, Вы писали:

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


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


S>>>Через рефлектор или CreateDelegate найти адрес метода и вствить его в соответствующее поля делегата, а на место ссылки на объект this.


Dax>>Не выйдет.

Dax>>Делегат — не адрес метода, он намертво с объектом-владельцем метода связан. А как раз-таки ссылку на "объект-дедушку" вычислить не получится. Боюсь, что в VTBL текущего обекта даже упоминания нет про "дедушкин" метод. Такое пройдет только со статическим методом или если "дед" сам такой делегат вернет.
S> Почему же, делегат как раз имеет списочную структуру типа TMethod. А вот как выдернуть ссылку на дедушкин метод это другая проблема. Если это не абстрактный класс или через неабстрактного наследника не перекрывающего этот метод адрес выдернуть метода выдернуть можно просто создав объект этого типа создать делегат с его методом и заменить ссылку на объект на this.

Кстати, через MethodInfo.MethodHandle.GetFunctionPointer(); можно вытащить любой метод типа и соответственно заполнив структур делегата все сделать и без создания дедушкиного объекта.
и солнце б утром не вставало, когда бы не было меня
Re[5]: Неужели на C# такое не сделать???
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.01.04 11:21
Оценка:
Кстати стоит удалять лишнее цитирование.
... << RSDN@Home 1.1.2 beta 2 >>
AVK Blog
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.