Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
3 / 3 / 0
Регистрация: 22.12.2010
Сообщений: 29
1
.NET 4.x

Получение диаграммы классов по исходному коду

17.01.2013, 19:43. Показов 4517. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Есть задача - обработать введенный пользователем на форме код, получить диаграмму классов со всеми полями, методами, константами. Т.е. на входе некоторый текст кода, а на выходе некая структура, в которой сохранена диаграмма описанных классов.

Есть мысли копать в сторону Reflection API, либо в сторону регулярных выражений, либо на крайняк в сторону конечных автоматов. А что посоветуете Вы? Или может есть какие статьи?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2013, 19:43
Ответы с готовыми решениями:

Построить диаграмму классов по исходному коду
помогите пожалуста кто может построить диаграму классов по исходному коду, у меня в StarUML...

Построение диаграммы классов по коду
Натолкните на мысль, как построить диаграмму классов по этому коду......

Программа построения диаграммы классов UML по коду
Всем привет) Собственно вопрос в теме. Кто-нибудь знает подобную?использовал? Спасибо

Вопрос по исходному коду
доброго времени суток.. Тут писал от балды себе развлекательную интерелектуальную игрушку на...

3
70 / 69 / 10
Регистрация: 14.06.2009
Сообщений: 310
Записей в блоге: 1
18.01.2013, 11:25 2
я бы посоветовал поискать парсер C#, более чем уверен что таких должно быть много, цепляй библиотеку и уже интерфейс прикручивай
0
Эксперт Java
4093 / 3827 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
18.01.2013, 11:55 3
Цитата Сообщение от EatingPeopleIsFun Посмотреть сообщение
я бы посоветовал поискать парсер C#
NRefactory - https://github.com/icsharpcode/NRefactory
0
3 / 3 / 0
Регистрация: 22.12.2010
Сообщений: 29
05.02.2013, 18:51  [ТС] 4
Спасибо за советы.
Решил задачу так:
1) Откомпилировал исходный код при помощи CSharpCodeProvider.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            protected Dictionary<string, string> providerOptions = new Dictionary<string, string>
            {
                 {"CompilerVersion", "v4.0"}
            };
            ...
            this.codeProvider = new CSharpCodeProvider(providerOptions);
            this.compilerParams = new CompilerParameters 
            {
                OutputAssembly = this.outputAssembly,   //задает адрес для сохранение исполняемого, либо dll файла
                GenerateExecutable = this.generateExecutable,  //нужен dll, либо exe
            };
 
            // Компиляция
            this.compilerResults = this.codeProvider.CompileAssemblyFromSource( this.compilerParams, this.sourceCode );
Соответственно на выходе есть объект класса CompilerResults,из которого можно получить исчерпывающую информацию об ошибках.

2) Далее полученную сборку можно разобрать при помощи Рефлектора.
Рефлектор может кушать сам файл dll, а может кушать массив байтов, в который мы побайтно счиатем этот файл(я так и сделал, чтобы избавится от проблем захвата файла, увы, красивого решения тут не нашел( ).
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
           ///готовим массив и считываем в него нашу библиотеку 
           byte[] bytes;
 
            using (FileStream fsSource = new FileStream(this.pathToDllFile, FileMode.Open, FileAccess.Read))
            {
                bytes = new byte[fsSource.Length];
                int numBytesToRead = (int)fsSource.Length;
                fsSource.Read(bytes, 0, numBytesToRead);
            }
            ///далее получаем загружаем ее
            Assembly loadedAssembly = Assembly.Load(bytes);
 
            //далее можем получить все типа описанные в этой библиотеке
            this.types = loadedAssembly.GetTypes();   ///где  this.types  это System.Type[] types;
После этого мы можем разобрать сам Type на члены вот таким образом
C#
1
System.Reflection.MemberInfo[] Members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
Можно узнать от какого типа наследуется данный тип
C#
1
type.BaseType.ToString();
Флаги указывают какие члены типа нужно выбирать.
Есть один момент, например, если один класс был объявлен внутри другого класса, то в сборки они будут находится на одном уровне, пример.
C#
1
2
3
4
5
6
class Foo
{
    class Foo2
    {
     }  
}
на выходе будет 2 класса на одном уровне Foo и Foo+Foo2

Далее из членов можно получать различные вещи, например
C#
1
2
member.DeclaringType.ToString() //возвращает тип, в котором был объявлен данный член
member.ToString(); //возвращает название этого типа
и т.п.

Вот так в кратце, если вопрос заинтересует, то советую почитать книгу Герберт Шилдт - C# 4.0. Полное руководство. Там на 541 странице начинается рассказ о рефлексии.

Могу прислать исходный код с пояснениями, если кому-то будет нужно.
1
05.02.2013, 18:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2013, 18:51
Помогаю со студенческими работами здесь

Разделение по строкам и исходному коду
Есть код, который отвечает за то чтобы в диапазоне не повторялось слово: Set Rng =...

Блок схема по исходному коду
Добрый вечер! Не могли бы вы составить блок схему по исходному коду? или посоветовать какую скачать...

Составить программу VB по исходному коду
дан код , нужно по нему составить программу. сможете сделать, очень нужно Private Sub...

Создать форму по исходному коду
Здраствуйте!Нужно создать форму приложения по готовому исходному коду .cpp , .h файлов. Помогите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru