Главная · Карта сайта · Поиск · Статьи · Компьютерные курсы · Обучающие программы · Открытые проекты · Веб-программирование · Создание интернет-сайта · Полезные ссылки · Глоссарий · Контакты · Декабрь 09 2016 20:19:10
Последнее опубликованное

Что такое Model-View-Controller
Pattern Model-View-Controller

Как создать свой веб-сайт
Как создать свой сайт в интернете

Разное
Статистика

Coding Craft Studio. Реализация простейшей IDE


Открытые проекты

О программе
Скачать исходный код проекта

Простейшая среда разработки программных продуктов на C# и VB.NET

Простейшая IDE для .NET. Общий вид

Проект Coding Craft Studio – это простейший инструмент для написания и отладки программ на C# и VB.NET. Простейший он потому, что не предоставляет таких удобств, как контекстные подсказки по типу intelliSence, в нем нет полноценного отладчика, нет профайлера и других полезных инструментов. Возможности текстового редактора весьма и весьма скромные. Проекты с многофайловой структурой напрямую также не поддерживаются. Собственно, этого всего не нужно, поскольку для профессиональной разработки сложных программных продуктов такой инструмент малопригоден. Для подобных целей стоит использовать полноценную интегрированную среду разработки Microsoft Visual Studio, которая, помимо перечисленных мною возможностей, предоставляет еще массу различных сервисов, в том числе инфраструктуру для совместной разработки программных решений (Team Foundation Server, TFS).

Простейшая IDE для .NET. Описание проекта

Что может эта программа, и с какой целью я здесь выкладываю ее исходный код? Возможности программы следующие: пользователь может писать текст программ на C# или VB.NET, запускать его и выполнять простейшие действия по отладке (программа сообщает об ошибках и указывает их местонахождение), создавать запускаемые модули (exe) или динамически подключаемые библиотеки (dll), подключать другие программные компоненты и сохранять исходный код и параметры сборки в текстовых файлах.

Кому может быть полезен такой инструмент программирования? Ну, во-первых, его можно использовать в рамках учебных курсов по программированию, поскольку он является бесплатным, а его возможностей для целей обучения основам программирования и алгоритмизации вполне хватает. На сайте codingcraft.ru эта программа как раз и предлагается в качестве обучающего инструмента курса программирования для начинающих. Имея исходный код проекта на C#, можно “докрутить” его функциональность под требования конкретного процесса обучения, к примеру, подключить библиотеки с базовыми алгоритмами, встроить автоматизированную подсистему проверки результатов заданий и выставления оценок и т.п. Во-вторых, часть исходного программного кода этого проекта можно использовать при разработке прикладных подсистем, в задачи которых входит интерпретация различного рода бизнес - сценариев, исполнения внешних хранимых процедур и т.д. Более подробно про задачу разработки plug-in архитектуры написано здесь.

Описание проекта

Весь проект можно условно разделить на две части: сервисы документа программы и элементы его окружения. Сервисы документа выделены в отдельное пространство имен Document. Основным типом пространства имен Document является сам документ программы – класс CSSDocument, который инкапсулирует в себе пользовательский программный код, различного рода настройки, ссылки на внешние программные компоненты и результаты компиляции. К основным задачам класса CSSDocument относятся: динамическая компиляция, чтение и сохранения программного кода и настроек программы в текстовых файлах, формирование exe и dll модулей и выполнение программы в режиме отладки. Все остальные части Coding Craft Studio – это элементы окружения документа, главной задачей которого является организация взаимодействия с пользователем посредством GUI. Как я уже сказал, проект написан на языке программирования C#. Исходный код сопровождается комментариями, которые при наличии желания помогут разобраться в его работе.

В основе программы используется технология отражения (reflection), которая предоставляет интерфейсы для доступа к элементам загруженной или динамически сформированной программной сборки (Assembly). Технология отражения построена на базе сервисов чтения и обработки метаданных сборки .NET, более подробно про которые можно узнать в материалах, посвященных виртуальной машине CLR и ее окружению. Если кратко описать алгоритм работы программы, то выглядит это следующим образом. Сначала создаем и инициализируем сервис динамической компиляции (CodeDomProvider). Выполняем динамическую компиляцию, вызывая соответствующий метод (CompileAssemblyFromSource) и передавая в качестве параметров экземпляр класса настроек (CompilerParameters) и сам программный код. Если компиляция прошла без ошибок, то ее результатом является сформированная в памяти сборка. Далее, средствами отражения ищем в полученной сборке тип приложения (класс Application), ищем с помощью все того же отражения у этого типа точку входа (метод Main). Потом создаем экземпляр типа приложения и запускаем его, вызывая метод точки входа. В процессе постоянно контролируем возникновение исключительных ситуаций и должным образом их обрабатываем. Все довольно просто, и в подтверждение этих слов ниже приведена часть исходного кода класса CSSDocument, содержащая методы компиляции и запуска программы: Compile() и Run().

namespace CodingCraftStudio
{
    //Основые сервисы Coding Craft Studio
    namespace Document
    {
        //Поддерживаемые языки программирования
        public enum CCSLanguage
        {
            CSharp = 0,
            VisualBasic = 1
        }

        //Документ приложения (исходный код, список библиотек)
        public class CCSDocument
        {
            ...часть исходного кода пропущена...
         
            //Динамическая компиляция программного кода
            private void Compile(CompilerParameters _CompilerParameters, ref CompilerResults _CompilerResults)
            {
                _CompilerParameters.CompilerOptions = this.CompilerOptions;

                foreach (CCSString _Reference in m_References)
                    _CompilerParameters.ReferencedAssemblies.Add(_Reference.Value);

                CodeDomProvider _Provider = null;

                switch (this.Language)
                {
                    case CCSLanguage.CSharp:
                        {
                            _Provider = new CSharpCodeProvider();
                            break;
                        }
                    case CCSLanguage.VisualBasic:
                        {
                            _Provider = new VBCodeProvider();
                            break;
                        }
                }

                if (_CompilerParameters.GenerateExecutable)
                    if (_Provider.Supports(GeneratorSupport.EntryPointMethod))
                        _CompilerParameters.MainClass = this.NameSpace + "." + this.ApplicationTypeName;

                _CompilerResults = _Provider.CompileAssemblyFromSource(_CompilerParameters, this.Code);

                if (_CompilerResults.Errors.Count > 0)
                    throw new CCSRunTimeException("Ошибки компиляции!");
            }

            //Динамическая сборка
            [System.ComponentModel.Browsable(false)]
            public Assembly CompiledAssembly
            {
                get
                {
                    if (m_CompilerResults == null)
                        return null;

                    return m_CompilerResults.CompiledAssembly;
                }
            }

            //Получение типа динамической сборки по имени
            [System.ComponentModel.Browsable(false)]
            public Type CompiledType(string _Name)
            {
                if (m_CompilerResults == null)
                    return null;

                if (_Name == string.Empty)
                    return null;

                return m_CompilerResults.CompiledAssembly.GetType(_Name);
            }

            //Создание экземпляра типа
            public object CreateInstance(Type _Type)
            {
                return _Type.GetConstructor(Type.EmptyTypes).Invoke(null);
            }

            //Запуск приложения
            public void Run()
            {
                if (string.IsNullOrEmpty(this.ApplicationTypeName))
                    throw new CCSSettingsException("Не задан класс приложения: ApplicationTypeName!");

                this.Compile();

                Type _type;
                _type = this.CompiledType(this.NameSpace + "." + this.ApplicationTypeName);

                if (_type == null)
                    throw new CCSRunTimeException("Класс " + this.ApplicationTypeName + " не определен!");

                MethodInfo _entryPoint;
                _entryPoint = this.CompiledAssembly.EntryPoint;

                if (_entryPoint == null)
                    throw new CCSRunTimeException("Не определена точка входа!");

                object _object;
                _object = this.CreateInstance(_type);

                if (_object == null)
                    throw new CCSRunTimeException("Не удалось создать экземпляр " + this.ApplicationTypeName + "!");

                try
                {
                    _type.InvokeMember(_entryPoint.Name, BindingFlags.InvokeMethod, null, _object, null);
                }
                catch (Exception ex)
                {
                    throw new CCSRunTimeException("Не удалось вызвать метод точки входа " + _entryPoint.Name 
                                        + " приложения " + this.ApplicationTypeName + "! " + ex.Message, ex);
                }
            }

            ...часть исходного кода пропущена...
        }
    }
}

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

Компьютерные курсы и курсы программирования
Основы программирования

Курс для начинающих программистов на C# и VB.NET.

SQL 25™

Построение SQL запросов и работа с базой данных.

C# Quick Guide™

Программирование на C#. Краткое руководство.

RegEx

Применение регулярных выражений.

Plug-in архитектура

Примеры программной Plug-in архитектуры.

XML и его расширения

Язык разметки XML и его расширения с примерами.

HTML и разметка гипертекста

Языки HTML, XHTML и CSS с примерами разметки.

Основы веб-дизайна

Основы веб-дизайна: решения типовых задач верстки.

Программирование на PHP

Руководство по программированию на PHP для начинающих.

Справочные материалы

Шаблоны проектирования
Каталог шаблонов проектирования программных компонентов.

Рефакторинг кода
Каталог приемов рефакторинга программного кода.

Гость
Имя

Пароль



Забыли пароль?
Запросите новый здесь
.
Coding Craft. Все права защищены © 2011. Проект Инициативного Народного Фронта Образования - ИНФО-проект.