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

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

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

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

Есть мысли копать в сторону Reflection API, либо в сторону регулярных выражений, либо на крайняк в сторону конечных автоматов. А что посоветуете Вы? Или может есть какие статьи?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.01.2013, 19:43
Ответы с готовыми решениями:

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

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

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

3
70 / 69 / 10
Регистрация: 14.06.2009
Сообщений: 310
Записей в блоге: 1
18.01.2013, 11:25
я бы посоветовал поискать парсер C#, более чем уверен что таких должно быть много, цепляй библиотеку и уже интерфейс прикручивай
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
18.01.2013, 11:55
Цитата Сообщение от EatingPeopleIsFun Посмотреть сообщение
я бы посоветовал поискать парсер C#
NRefactory - https://github.com/icsharpcode/NRefactory
0
 Аватар для Externus
3 / 3 / 0
Регистрация: 22.12.2010
Сообщений: 29
05.02.2013, 18:51  [ТС]
Спасибо за советы.
Решил задачу так:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.02.2013, 18:51
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru