![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| KuZyagroup |
|
|||
![]() magento solution ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 16.4.2007 Где: Kiev Репутация: нет Всего: 4 |
Можно ли в C# выполнить строку:
То есть если ли такая SuperFunctrion которая строку выполняет как текст прорграммы. В моем примере она должна запустить MyFunction(); |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 7 Всего: 93 |
для конкретно этого примера(выполнить ф-цию, имея её имя в строковой переменной) точно подойдёт reflection... насчёт произвольного кода не уверен... вроде никак низя(кроме как запускания компилятора, получения дин. либы, run-time линковки и запуска нужной entry-point) Это сообщение отредактировал(а) archimed7592 - 25.5.2007, 01:43 -------------------- 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 |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
archimed7592, c помощью рефлексии можно выполнить вообще все, а динамически сгенерированный код сбросить с поток, записать в файл, методом Process.Start() запустить компилятор, скомпилить и запустить только зачем все это? зачем будить лихо, пока оно тихо? не проще ли KuZyagroup, в твою функцию SuperFunctrion передавать какой-нибудь флаг, по значению которого она выбирала бы из существующих ф-ций ту, которую нужно выполнить? Так винда делает, да и делегаты. Передается цифровой ID метода в качестве флага, ну а потом - что-то типа switch-case? А еще лучше сразу через делегат. Передавай его как параметр в SuperFunctrion, а устанавливай там, где ты устанавливаешь строку с именем метода. Это сообщение отредактировал(а) tol05 - 25.5.2007, 09:14 -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 7 Всего: 93 |
я сказал то же самое
Добавлено через 1 минуту и 10 секунд или ты имеешь ввиду, что без компилятора, с помощью рефлексии можно выполнить произвольный код? -------------------- 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 |
|||
|
||||
| Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: 9 Всего: 62 |
Чтобы написать новый магаполиморфный самосебяпрограммирующий супервирус с AI! Который захватит все компы с Вистой! И положит игровые серверы Пентагона с контрой и батлфилдом! И имя ему - SKYNET. |
|||
|
||||
| tol05 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Извини,
archimed7592, видно не с той стороны читал твой пост Но и тут ты не до конца прав. Можно сделать все Цитата из Троелсена (второе издание, для .Net 1.x)
Сам не пробовал, но если бы надо было, попробовал бы так:
Это сообщение отредактировал(а) tol05 - 25.5.2007, 11:45 -------------------- На хорошей работе и сны хорошие снятся. |
||||
|
|||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 7 Всего: 93 |
tol05, я имею ввиду, что, если у тебя есть строка, прелставляющая из себя код на любом .net языке, скажем, c#...
тебе понадобится, либо компилятор, либо самому транслировать этот код в примитивы, которые умеет делать reflection... я не прав? -------------------- 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 |
|||
|
||||
| tol05 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Что-то я запутался уже...
было понято мной как: "нельзя в сборке написать что попало, запустить и выполнить". Ответ: Можно.
Ответ: ага! Компилятор не понадобится (второй пост пытается продемонстрировать это). Что значит "самому транслировать этот код в примитивы"? Раз reflection "умеет делать", пусть и делает Как это самому? Ну код хоть какой-нибудь, конечно все-таки надо написать я и написал. Наверняка он работать не будет, я же не тестил, но возможности-то есть? Просто готовый IL грузится сразу в память домена, а дальше - все как положено, вызов -> JIT -> богатство и слава Я не хотел усложнять. Тот же Троелсен гораздо больше написал, чем я цитировал... Может конечно уже старый Троелсен не у каждого есть, тогда допишу. Что-то типа этого будет:
-------------------- На хорошей работе и сны хорошие снятся. |
||||
|
|||||
| Voyager |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 532 Регистрация: 8.2.2005 Репутация: 3 Всего: 18 |
Смотри в сторону CSharpCodeProvider и CodeDom.
|
|||
|
||||
| archeg |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 11 Всего: 27 |
Reflection.Emit позволяет использовать CIL-код, создавая находу части кода и сразу же их запуская с помощью JIT
CodeDOM позволяет создавать на C#, VB.NET, C++, может еще чем-та. После этого происходит компиляция языка и запуск его (уже другая сборка). В зависимости от того, что нужно - нужно использовать либо то, либо то P.S. Reflection и Reflection.Emit - немного разные вещи Это сообщение отредактировал(а) archeg - 25.5.2007, 14:11 -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
|||
|
||||
| KuZyagroup |
|
||||||
![]() magento solution ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 16.4.2007 Где: Kiev Репутация: нет Всего: 4 |
А можно подетальней про reflection. П.С. А метод через компилятор слишком неоправданый в случае когда надо упростить
Добавлено через 5 минут и 22 секунды
Спасибо за ответ Пока оно в таком виде и есть. Про делегаты только сегодня первый раз услышал - посмотрю, разберусь может поможет. Добавлено через 6 минут и 47 секунд Voyager, Спасибо за ответ, обязательно посмотрю |
||||||
|
|||||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 7 Всего: 93 |
KuZyagroup, я точно не помню... вирутальную машину запускать влом(у меня там студия
что тебе нужно: ознакомится с пространством имён Reflection, найти там ф-ции для поиска ф-ций(сорри за каламбур) и ф-ции для запуска произвольной ф-ции с передачей ей определенных аргументов... -------------------- 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 |
|||
|
||||
| KuZyagroup |
|
|||
![]() magento solution ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 16.4.2007 Где: Kiev Репутация: нет Всего: 4 |
archeg, спасибо за ответ
А можно пример |
|||
|
||||
| archimed7592 |
|
||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 7 Всего: 93 |
вот пример из мсдн:
отсюда Добавлено через 4 минуты и 54 секунды вот ещё
отсюда -------------------- 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 |
||||
|
|||||
| KuZyagroup |
|
|||
![]() magento solution ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 16.4.2007 Где: Kiev Репутация: нет Всего: 4 |
Спасиб огромное ))
|
|||
|
||||
| archimed7592 |
|
||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 7 Всего: 93 |
tol05, насчёт твоего поста - сорри, заметил ток сейчас...
если честно, не очень понимаю о чём ты говоришь, а потому задам вполне конкретный вопрос и хочу получить вполне конкретный ответ(да/нет)... итак меня интересует, можно ли, используя только лишь рефлексию(без компилятора/транслятора), исполнять произвольный код(хранящийся в строке)? что я подразумеваю под компилятором, транслятором и т. п.? ну вот вполне конкретный пример... есть у меня строковая переменная src со следующим содержанием:
итак, что мы можем сделать с этим кодом? ну, обрамить его каким-то шаблоном аля
можем пойти по другому пути: написать свой, более или менее мудрый транслятор... что это значит? ну примитивную строку "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 |
||||
|
|||||
| KuZyagroup |
|
||||
![]() magento solution ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 16.4.2007 Где: Kiev Репутация: нет Всего: 4 |
msdn говорит
и оно работает. А как запустить Invoke из своего класа
|
||||
|
|||||
| tol05 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
всем привет.
archimed7592, честно говоря, в такие дебри мы позалазили, что нужно эту тему сначала пол-часа читать, что б понять, кто о чем говорит
Смотря что понимать под произвольным кодом. Если шарповский код - то нет. Если строчки типа
Но если писать конструкции кода MSIL (как я показал) - то да, можно, без компилятора, транслятора. А ведь есть люди, которые пишут на MSIL, на ассемблере. Найдите где-нибудь книгу Алексея Дубовцева "Microsoft .Net в подлиннике" - он половину примеров на чистом IL пишет (в блокноте правда, но я показал, как можно динамически) и ничего, жив пока. Я не говорю, что это делать нужно... Я говорю, что возможности для этого .Net обеспечивает. P.S. KuZyagroup, что-то код твоего класса мало C# напоминает А запустить - просто. Загружаешь сборку, получаешь из нее нужный тип, у типа ишешь среди MethodInfo[] нужный тебе метод, формируешь для этого, конкретного MethodInfo нужные ParameterInfo и вызываешь MethodInfo.Invoke (если не ошибаюсь) Это сообщение отредактировал(а) tol05 - 30.5.2007, 10:06 -------------------- На хорошей работе и сны хорошие снятся. |
||||
|
|||||
| KuZyagroup |
|
|||
![]() magento solution ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 16.4.2007 Где: Kiev Репутация: нет Всего: 4 |
вопрос в том как передать первый параметр Invoke |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Это сообщение отредактировал(а) tol05 - 30.5.2007, 10:55 -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 |
|||
|
||||
| KuZyagroup |
|
|||
![]() magento solution ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 16.4.2007 Где: Kiev Репутация: нет Всего: 4 |
Слава богу, священной войны не будет
П.С. хотя прикольно звучало
|
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |