| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Выполнить строку |
| Автор: KuZyagroup 25.5.2007, 01:36 | ||
Можно ли в C# выполнить строку:
То есть если ли такая SuperFunctrion которая строку выполняет как текст прорграммы. В моем примере она должна запустить MyFunction(); |
| Автор: archimed7592 25.5.2007, 01:43 |
для конкретно этого примера(выполнить ф-цию, имея её имя в строковой переменной) точно подойдёт reflection... насчёт произвольного кода не уверен... вроде никак низя(кроме как запускания компилятора, получения дин. либы, run-time линковки и запуска нужной entry-point) |
| Автор: archimed7592 25.5.2007, 11:17 | ||||
Добавлено через 1 минуту и 10 секунд или ты имеешь ввиду, что без компилятора, с помощью рефлексии можно выполнить произвольный код? |
| Автор: Ch0bits 25.5.2007, 11:31 |
Чтобы написать новый магаполиморфный самосебяпрограммирующий супервирус с AI! Который захватит все компы с Вистой! И положит игровые серверы Пентагона с контрой и батлфилдом! И имя ему - SKYNET. |
| Автор: tol05 25.5.2007, 11:43 | ||||
| Извини, archimed7592, видно не с той стороны читал твой пост Но и тут ты не до конца прав. Можно сделать все Цитата из Троелсена (второе издание, для .Net 1.x)
Сам не пробовал, но если бы надо было, попробовал бы так:
|
| Автор: archimed7592 25.5.2007, 11:55 |
| tol05, я имею ввиду, что, если у тебя есть строка, прелставляющая из себя код на любом .net языке, скажем, c#... тебе понадобится, либо компилятор, либо самому транслировать этот код в примитивы, которые умеет делать reflection... я не прав? |
| Автор: tol05 25.5.2007, 12:35 | ||||||||
Что-то я запутался уже...
было понято мной как: "нельзя в сборке написать что попало, запустить и выполнить". Ответ: Можно.
Ответ: ага!
Компилятор не понадобится (второй пост пытается продемонстрировать это). Что значит "самому транслировать этот код в примитивы"? Раз reflection "умеет делать", пусть и делает Как это самому? Ну код хоть какой-нибудь, конечно все-таки надо написать я и написал. Наверняка он работать не будет, я же не тестил, но возможности-то есть? Просто готовый IL грузится сразу в память домена, а дальше - все как положено, вызов -> JIT -> богатство и слава Я не хотел усложнять. Тот же Троелсен гораздо больше написал, чем я цитировал... Может конечно уже старый Троелсен не у каждого есть, тогда допишу. Что-то типа этого будет:
|
| Автор: Voyager 25.5.2007, 13:03 |
| Смотри в сторону CSharpCodeProvider и CodeDom. |
| Автор: archeg 25.5.2007, 14:08 |
| Reflection.Emit позволяет использовать CIL-код, создавая находу части кода и сразу же их запуская с помощью JIT CodeDOM позволяет создавать на C#, VB.NET, C++, может еще чем-та. После этого происходит компиляция языка и запуск его (уже другая сборка). В зависимости от того, что нужно - нужно использовать либо то, либо то P.S. Reflection и Reflection.Emit - немного разные вещи |
| Автор: KuZyagroup 30.5.2007, 04:12 | ||||||
А можно подетальней про reflection. П.С. А метод через компилятор слишком неоправданый в случае когда надо упростить
Добавлено через 5 минут и 22 секунды
Спасибо за ответ Пока оно в таком виде и есть. Про делегаты только сегодня первый раз услышал - посмотрю, разберусь может поможет. Добавлено через 6 минут и 47 секунд Voyager, Спасибо за ответ, обязательно посмотрю |
| Автор: archimed7592 30.5.2007, 04:20 |
| KuZyagroup, я точно не помню... вирутальную машину запускать влом(у меня там студия что тебе нужно: ознакомится с пространством имён Reflection, найти там ф-ции для поиска ф-ций(сорри за каламбур) и ф-ции для запуска произвольной ф-ции с передачей ей определенных аргументов... |
| Автор: KuZyagroup 30.5.2007, 04:21 | ||
archeg, спасибо за ответ
А можно пример |
| Автор: archimed7592 30.5.2007, 04:22 | ||||
вот пример из мсдн:
http://msdn2.microsoft.com/en-us/library/8zz808e6.aspx Добавлено через 4 минуты и 54 секунды вот ещё
http://msdn2.microsoft.com/en-us/library/53cz7sc6.aspx |
| Автор: KuZyagroup 30.5.2007, 04:29 |
| Спасиб огромное )) |
| Автор: archimed7592 30.5.2007, 05:00 | ||||
| tol05, насчёт твоего http://forum.vingrad.ru/index.php?showtopic=152990&view=findpost&p=1145139 - сорри, заметил ток сейчас... если честно, не очень понимаю о чём ты говоришь, а потому задам вполне конкретный вопрос и хочу получить вполне конкретный ответ(да/нет)... итак меня интересует, можно ли, используя только лишь рефлексию(без компилятора/транслятора), исполнять произвольный код(хранящийся в строке)? что я подразумеваю под компилятором, транслятором и т. п.? ну вот вполне конкретный пример... есть у меня строковая переменная src со следующим содержанием:
итак, что мы можем сделать с этим кодом? ну, обрамить его каким-то шаблоном аля
можем пойти по другому пути: написать свой, более или менее мудрый транслятор... что это значит? ну примитивную строку "myFunction()" мы исполнять уже умеем... добавить другие примитивы и работать рефлексией как виртуальной машиной... т.е. while перейдет в несколько маленьких шагов, внутри которых будут вообще примитивные шаги... т. е. нам придется сделать уже не конечное число операций(скомпилировать, запустить - 2 операции), а фиг знает сколько... т.е. мы превратимся в т.н. виртуальный процессор... заметьте, нам понадобился транслятор, т. е. штука которая не компилирует код, но не так глобально как компилятор, а только лишь в примитивы, которые умеет делать наш виртуальный процессор(что умеет делать рефлексия). итак, ещё раз, вопрос: можно ли обойтись без того или иного в том или ином виде, чтобы исполнять произвольный код? т.е. я с клавиатуры введу программу и она должна исполниться... AFAICS, ответ - нет. но я сравнительно давно забросил изучение .net и могу быть некомпетентен в этом вопросе... потому и спрашиваю. если ответ - да, то не нужно ни о чем спорить и что-либо комментировать: просто приведите маленький кусочек кода, который выполнит мою строку src. замечу, что я могу изменить строку src и поведение вашего примера должно изменится... |
| Автор: KuZyagroup 30.5.2007, 05:29 | ||||
http://msdn2.microsoft.com/en-us/library/8zz808e6(vs.80).aspx
и оно работает. А как запустить Invoke из своего класа
|
| Автор: tol05 30.5.2007, 10:03 | ||||
| всем привет. archimed7592, честно говоря, в такие дебри мы позалазили, что нужно эту тему сначала пол-часа читать, что б понять, кто о чем говорит
Смотря что понимать под произвольным кодом. Если шарповский код - то нет. Если строчки типа
Но если писать конструкции кода MSIL (как я показал) - то да, можно, без компилятора, транслятора. А ведь есть люди, которые пишут на MSIL, на ассемблере. Найдите где-нибудь книгу Алексея Дубовцева "Microsoft .Net в подлиннике" - он половину примеров на чистом IL пишет (в блокноте правда, но я показал, как можно динамически) и ничего, жив пока. Я не говорю, что это делать нужно... Я говорю, что возможности для этого .Net обеспечивает. P.S. KuZyagroup, что-то код твоего класса мало C# напоминает А запустить - просто. Загружаешь сборку, получаешь из нее нужный тип, у типа ишешь среди MethodInfo[] нужный тебе метод, формируешь для этого, конкретного MethodInfo нужные ParameterInfo и вызываешь MethodInfo.Invoke (если не ошибаюсь) |
| Автор: KuZyagroup 30.5.2007, 10:36 | ||
вопрос в том как передать первый параметр Invoke |
| Автор: tol05 30.5.2007, 10:54 | ||
|
| Автор: archimed7592 30.5.2007, 20:23 |
| tol05, ладно, думаю мы все избавились от иллюзии, что рефлексия может исполнять произвольный код на .net языке. что-же касается MSIL - его тоже придётся парсить... ты не показал ф-ции, которая берёт на вход строку, представляющую из себя MSIL код, и исполняет её... спасибо за дискуссию. |
| Автор: KuZyagroup 31.5.2007, 02:23 | ||
| Слава богу, священной войны не будет П.С. хотя прикольно звучало
|