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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инормация о переменных, объявленных в методе. 
:(
    Опции темы
desevg
Дата 26.7.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



к примеру есть код сбоки:

Код

using System;
using System.Collections.Generic;
using System.Text;
namespace UserAssembly
{
    class Program
    {
        static void Main(string[] args) {}
    }
    public class Code {
       public string doUserCode() { 
         int a = 10;
         string s = "asd";  
         return s;
      }
    }
}


допустим, я подгружаю эту сборку динамически.
потом я могу получить какие в этой сборке есть классы. допустим узнаю, что в этой сборке есть класс Code. получаю информацию, что в нем есть метод doUserCode.. а я могу как-нибудь узнать, какие есть локальные переменные в этом методе?



Это сообщение отредактировал(а) desevg - 26.7.2009, 16:00
PM MAIL   Вверх
kobra
Дата 26.7.2009, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



если сделать их публичними, да
PM MAIL   Вверх
desevg
Дата 26.7.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



публичными? оО это же не свойства класса, а просто локальные переменные метода. вопрос открыт! если что я не понимаю, приведите пример, пожалуйста

Это сообщение отредактировал(а) desevg - 26.7.2009, 18:09
PM MAIL   Вверх
Экскалупатор
Дата 26.7.2009, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



desevg, программно я думаю не сможете(имхо, я не волшебник я только учусь) т.е. во время выполнения вашего кода, а вот чем_нибудь сторонним дизасемблировать я думаю можно. ILDasm вроде умеет, если конечно переменные не были переименованы во время компиляции.
PM MAIL ICQ   Вверх
mihryak
Дата 26.7.2009, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 19
Всего: 36



PM MAIL ICQ   Вверх
desevg
Дата 26.7.2009, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Экскалупатор, нет. нужно программно.

mihryak, неплохой класс. но как я понял, он даст только представление о типах переменных и их количестве. я попробую еще порыть там, но мне нужно вытащить имена переменных, которые там содержатся. если кто знает, помогитеsmile

Да, как я и предположил на скидку, он выдает тип и индекс переменной в стеке, а мне по зарез нужны имена.

определю задачу. мне нужно сделать следующее.

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

как вариант, можно, конечно, распарсить код набранный пользователем, но хочется изящного решения;)

нашел класс FieldInfo, но он для класса. Там можно для класса получить поля:

Код

FieldInfo[] fi;
Type f = typeof(yourClass);
t = f.GetFields(...);

t[index].Name - получаешь имя поля



не уж то нет для локальных такого?:(

Это сообщение отредактировал(а) desevg - 26.7.2009, 21:34
PM MAIL   Вверх
mihryak
Дата 26.7.2009, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 19
Всего: 36



хотя при вызове TypeBuilder.DefineField и требуется указать имя переменной, интернет-сообщество сходится во мнении, что получить их обратно через рефлексию уже не удастся
судя по всему, придётся разбирать IL, искомое будет находиться в  директиве .locals

пс. тебе не поможет, но всё равно занятная статейка нагуглилась - http://abdullin.com/journal/2008/12/13/how...-name-in-c.html
PM MAIL ICQ   Вверх
desevg
Дата 27.7.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



интересная статья, правда немного сложно для меня. я в шарпе без году неделя... что-то ничего так и несмог пока найти, как получить. ты говоришь, что нужно разбирать IL, а можешь по подробней написать? в какую сторону рыть?
PM MAIL   Вверх
mihryak
Дата 27.7.2009, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 19
Всего: 36



не, не могу, увы, сам "не в теме"
никогда этим не занимался, а разбираться долго и сложно

посмотри на http://sourceforge.net/projects/reflexil/
PM MAIL ICQ   Вверх
Экскалупатор
Дата 27.7.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



desevg, сдается мне, что проще будет распарсить то что введет пользователь, чем разбирать IL
PM MAIL ICQ   Вверх
mihryak
Дата 28.7.2009, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 19
Всего: 36



Цитата(Экскалупатор @  27.7.2009,  23:32 Найти цитируемый пост)
desevg, сдается мне, что проще будет распарсить то что введет пользователь, чем разбирать IL 

синтаксический разбор языка - тоже не задачка на 5 минут
к тому же, в скомпилированном коде могут отсутсвовать некоторые из распарсенных переменных

а вообще - имеет ли вообще задача решение?
например, локальные переменные объявлены в цикле, из значение в конце цикла неопределено, да и вообще не несёт никакого цикла
а при использовании анонимных делегатов-лямбд вообще будут сгенерированы дополнительные классы. что делать с ними?
PM MAIL ICQ   Вверх
desevg
Дата 28.7.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mihryak @  28.7.2009,  08:34 Найти цитируемый пост)
а при использовании анонимных делегатов-лямбд вообще будут сгенерированы дополнительные классы. что делать с ними? 


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

алгоритмы в один метод, как правило. Ученик будет рисовать блок схему и по ней будет собираться код. потом подставляться в код подготовленного метода и если выбран режим компиляции, то создается ехе файл, а если отладки, для этого и нужен вышеописанный гем**ой. нужно проанализировать переменные, которые есть и подставить свой код, который после исполнения метода вернет данные по переменным для анализа.

Добавлено @ 13:14
т.е.

Код

Подготовленный класс {
  метод {
      /*
               код школьника
      */
     /*
        код, анализирующий и возвращающий переменные.
    */
  }
}


соответственно, вызывать это чудо можно рефлексией

Это сообщение отредактировал(а) desevg - 28.7.2009, 13:15
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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