Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выполнить строку, Помотите пожайлуста. 
:(
    Опции темы
archimed7592
Дата 30.5.2007, 05:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 7
Всего: 93



tol05, насчёт твоего поста - сорри, заметил ток сейчас...
если честно, не очень понимаю о чём ты говоришь, а потому задам вполне конкретный вопрос и хочу получить вполне конкретный ответ(да/нет)... итак
меня интересует, можно ли, используя только лишь рефлексию(без компилятора/транслятора), исполнять произвольный код(хранящийся в строке)?
что я подразумеваю под компилятором, транслятором и т. п.?
ну вот вполне конкретный пример... есть у меня строковая переменная src со следующим содержанием:
Код

int i = 0;
while (endPredicate())
{
    if (actionPredicate())
        doAction(myList[i]);
    ++i;
}
что подразумевает этот код? он подразумевает, что, где-то есть ф-ции endPredicate, actionPredicate, doAction, а также какая-то переменная myList, какого-то типа, для которого перегружен оператор []. семантику кода объяснять не буду, да она и не так важна.

итак, что мы можем сделать с этим кодом? ну, обрамить его каким-то шаблоном аля
Код
string src = "...";
string full_src =
"using System;\
using System.Collections;\
...\
namespace tmpNamespace {\
public class tmpClass {\
public static void tmpFunc() {"
   + src +
"}\
}\
}"
потом мы можем создать временный файлик и натравить на него компилятор(csc, к примеру)... полученную сборку подключить и вызвать нужную ф-цию используя рефлексию. заметьте, нам понадобился компилятор.

можем пойти по другому пути: написать свой, более или менее мудрый транслятор... что это значит? ну примитивную строку "myFunction()" мы исполнять уже умеем... добавить другие примитивы и работать рефлексией как виртуальной машиной... т.е. while перейдет в несколько маленьких шагов, внутри которых будут вообще примитивные шаги... т. е. нам придется сделать уже не конечное число операций(скомпилировать, запустить - 2 операции), а фиг знает сколько... т.е. мы превратимся в т.н. виртуальный процессор... заметьте, нам понадобился транслятор, т. е. штука которая не компилирует код, но не так глобально как компилятор, а только лишь в примитивы, которые умеет делать наш виртуальный процессор(что умеет делать рефлексия).

итак, ещё раз, вопрос: можно ли обойтись без того или иного в том или ином виде, чтобы исполнять произвольный код? т.е. я с клавиатуры введу программу и она должна исполниться...

AFAICS, ответ - нет. но я сравнительно давно забросил изучение .net и могу быть некомпетентен в этом вопросе... потому и спрашиваю.
если ответ - да, то не нужно ни о чем спорить и что-либо комментировать: просто приведите маленький кусочек кода, который выполнит мою строку src. замечу, что я могу изменить строку src и поведение вашего примера должно изменится...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
KuZyagroup
Дата 30.5.2007, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 16.4.2007
Где: Kiev

Репутация: нет
Всего: 4



msdn говорит
Код

using System;
using System.Reflection;
using System.Windows.Forms;

public class A
{
    public virtual int method () {return 0;}
}
 
public class B
{
    public virtual int method () {return 1;}
}
 
class Mymethodinfo
{
    public static int Main()
    {
        Console.WriteLine ("\nReflection.MethodInfo");
        A MyA = new A();
        B MyB = new B();
 
        // Get the Type and MethodInfo.
        Type MyTypea = Type.GetType("A");
        MethodInfo Mymethodinfoa = MyTypea.GetMethod("method");
 
        Type MyTypeb = Type.GetType("B");
        MethodInfo Mymethodinfob = MyTypeb.GetMethod("method");
 
        // Get and display the Invoke method.
        Console.Write("\nFirst method - " + MyTypea.FullName +
            " returns " + Mymethodinfoa.Invoke(MyA, null));
        Console.Write("\nSecond method - " + MyTypeb.FullName +
            " returns " + Mymethodinfob.Invoke(MyB, null));
        return 0;
    }
}

и оно работает.
А как запустить Invoke из своего класа
Код

public:
virtual Object^ Invoke (
    Object^ obj, 
    array<Object^>^ parameters
) sealed

PM MAIL   Вверх
tol05
Дата 30.5.2007, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



всем привет.
archimed7592, честно говоря, в такие дебри мы позалазили, что нужно эту тему сначала пол-часа читать, что б понять, кто о чем говорит  smile 

Цитата(archimed7592 @  30.5.2007,  05:00 Найти цитируемый пост)
используя только лишь рефлексию(без компилятора/транслятора), исполнять произвольный код(хранящийся в строке)?

Смотря что понимать под произвольным кодом. Если шарповский код - то нет. Если строчки типа 
Код

Возьми третий элемент массива и умножь его на 2;
Открой файл "C:\Test.txt" и прочитай полностью;

 smile тоже нет.
Но если писать конструкции кода MSIL (как я показал) - то да, можно, без компилятора, транслятора. А ведь есть люди, которые пишут на MSIL, на ассемблере. Найдите где-нибудь книгу Алексея Дубовцева "Microsoft .Net в подлиннике" - он половину примеров на чистом IL пишет (в блокноте правда, но я показал, как можно динамически) и ничего, жив пока. smile

Я не говорю, что это делать нужно... Я говорю, что возможности для этого .Net обеспечивает.

P.S. KuZyagroup, что-то код твоего класса мало C# напоминает smile
А запустить - просто. Загружаешь сборку, получаешь из нее нужный тип, у типа ишешь среди MethodInfo[] нужный тебе метод, формируешь для этого, конкретного MethodInfo нужные ParameterInfo и вызываешь MethodInfo.Invoke (если не ошибаюсь)

Это сообщение отредактировал(а) tol05 - 30.5.2007, 10:06


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
KuZyagroup
Дата 30.5.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 16.4.2007
Где: Kiev

Репутация: нет
Всего: 4



Цитата

А запустить - просто. Загружаешь сборку, получаешь из нее нужный тип, у типа ишешь среди MethodInfo[] нужный тебе метод, формируешь для этого, конкретного MethodInfo нужные ParameterInfo и вызываешь MethodInfo.Invoke (если не ошибаюсь)

вопрос в том как передать первый параметр Invoke
PM MAIL   Вверх
tol05
Дата 30.5.2007, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Код

public class A
{
    public virtual sealed Object Invoke(Object obj, Object[] parameters) {}
}
  
class Mymethodinfo
{
    public static int Main()
    {
        A MyA = new A();
 
        Type MyTypea = Type.GetType("A");
        MethodInfo method = MyTypea.GetMethod("Invoke");
        Object[] params = new Object[]{MyA, new Object[]{new Object(), new Object()} };

        method.Invoke(MyA, params);

        return 0;
    }
}


Это сообщение отредактировал(а) tol05 - 30.5.2007, 10:55


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
archimed7592
Дата 30.5.2007, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 7
Всего: 93



tol05, ладно, думаю мы все избавились от иллюзии, что рефлексия может исполнять произвольный код на .net языке.
что-же касается MSIL - его тоже придётся парсить... ты не показал ф-ции, которая берёт на вход строку, представляющую из себя MSIL код, и исполняет её...

спасибо за дискуссию.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
KuZyagroup
Дата 31.5.2007, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 16.4.2007
Где: Kiev

Репутация: нет
Всего: 4



Слава богу, священной войны не будет
П.С. хотя прикольно звучало 
Код

Возьми третий элемент массива и умножь его на 2;
Открой файл "C:\Test.txt" и прочитай полностью;

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.