51388

Построить решение, включающее в себя три проекта, которые содержат: проект DLL(библиотеку классов), консольный проект и Windows-проект

Контрольная

Информатика, кибернетика и программирование

Построить Решение включающее в себя три проекта которые содержат: проект DLLбиблиотеку классов консольный проект и Windowsпроект. Построим аналог класса Mth и поместим этот класс в проект DLLбиблиотеку классов что позволит повторно использовать его присоединяя при необходимости к различным проектам. Все три проекта будут находиться в одном Решении. Создание проектов: 1 Создание DLL проекта типа Библиотека классовClss Librry Запустить VS со стартовой страницы перейти к созданию проекта и в качестве типа проекта указать...

Русский

2014-02-10

205.17 KB

3 чел.

Пример 4.1.2-2. Построить Решение, включающее в себя три проекта, которые содержат: проект DLL(библиотеку классов), консольный проект и Windows-проект.

Постановка задачи

В системе типов языка VB есть несколько типов, задающих различные подмножества арифметического типа данных – int, double и другие. Для значения x любого из этих типов хорошо бы уметь вычислять математические функции – sin(x), ln(x) и другие. Встраивать вычисление этих функций в каждый из классов, задающих соответствующий арифметический подтип, кажется неразумным. Поэтому в библиотеку FCL включен класс Math, методы которого позволяют вычислять по заданному аргументу нужную математическую функцию. Класс Math является примером статического класса, играющего единственную роль – роль модуля. У этого класса нет собственных данных, если не считать двух математических констант – e и pi, а его методы являются сервисами, которые он предоставляет другим классам.

Построим аналог класса Math  и поместим этот класс в проект DLL(библиотеку классов), что позволит повторно использовать его, присоединяя при необходимости к различным проектам. В нашем примере не будем моделировать все сервисы класса Math. Ограничимся вычислением одной функции sin(x). Эту функцию, как и другие математические функции, можно вычислить, используя разложение в ряд Тэйлора:

(1)

Итак, необходимо  построить DLL, содержащую класс, являющийся аналогом класса Math из библиотеки FCL. Затем необходимо построить консольный проект, позволяющий провести тестирование корректности вычислений функций построенного нами класса. Затем необходимо построить Windows-проект. Все три проекта будут находиться в одном Решении.

Создание проектов:

1) Создание DLL - проекта типа «Библиотека классов(Class Library)»

Запустить VS, со стартовой страницы перейти к созданию проекта и в качестве типа проекта указать  тип  Библиотека классов (Class Library).  В открывшемся окне создания DLL, показанном на рис. 4.1.2-11,  все поля заполнены значениями по умолчанию. Как правило, их следует переопределить, задавая собственную информацию.

НА НИЖЕСЛЕДУЮЩЕМ РИСУНКЕ ПРЕДСТАВЛЕН ВИД ОКНА ДЛЯ С++, А НЕ VB!!! ЗАМЕНИТЬ РИСУНОК, показав в нем имя проекта ClassLibraryMath и имя решения Дубль!!!

           

Рис. 4.1.2-11.  Создание проекта DLL

В поле Имя (Name) по умолчанию задается имя строящейся DLL ClassLibrary1, изменим его на имя ClassLibraryMath в нашем случае.

В поле Расположение (Location) указывается путь к папке, где будет храниться Решение, содержащее проект.

В поле Решение (Solution) выбран элемент Создать новое решение(Create New Solution), создающий новое Решение. Альтернативой является элемент списка, указывающий, что проект может быть добавлен к существующему Решению. –хорошо бы показать рисунок, на котором это поле видно, а то на 4.1.2-11 это поле не видно и непонятно, зачем его упоминать

В окне Имя решения (Solution Name) задано имя Решения, по умолчанию совпадающее с именем проекта – ClassLibraryMath. Так как наше решение будет содержать не только проект с DLL (библиотекой классов) ClassLibraryMath, а будет включать в себя три проекта (DLL, консольный проект и Windows-проект), то нелогично оставлять предложенное по умолчанию имя. Дадим нашему решению имя Дубль –

Необходимо обратить внимание и на другие установки, сделанные в этом окне  - включен флажок (по умолчанию) Создать каталог для решения (Create directory for solution), в верхнем окошке из списка возможных каркасов выбран каркас Framework .Net 3.5. Задав требуемые установки и щелкнув по кнопке OK, получим автоматически построенную заготовку Проекта DLL, открытую в среде разработки проектов VS. На рис. 4.1.2-12  показан внешний вид среды с построенным Решением и Проектом.

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

В окне проектов Обозреватель решений  (Solution Explorer) показано Решение с именем Дубль, содержащее проект DLL  с именем ClassLibraryMath , соответствующие папки и файл с именем Class1.vb . 

Поскольку всякая DLL  содержит один или несколько классов, то для одного класса, которому по умолчанию дано имя Class1, заготовка построена. Класс этот, показанный в окне кода файла Class1.vb, пока что пуст – не содержит никаких элементов.

Рис. 4.1.2-12.  

Построенный автоматически класс вложен в пространство имен, которое по умолчанию получило имя, совпадающее с именем проекта – ClassLibraryMath.

Была рассмотрена подготовительная часть работы, которую Visual Studio выполнила для нас. Дальше предстоит потрудиться самим.  

Изменим имя Class1 на имя ClassLibraryMath. Это  продиктовано правилом стиля – имя класса и имя файла, хранящего класс, должны совпадать. Переименование имени файла делается непосредственно в окне обозревателя решений Solution Explorer. Следует выделить имя файла Class1.vb, и нажав правую кнопку мыши, выбрать пункт контекстного меню Переименовать. После переименования файла, среда разработки Visual Studio предложит заменить все ссылки на переименованный класс, и следует так и сделать, т.е. на запрос о замене надо ответить утвердительно.

Поскольку необходимо создать аналог класса Math, то в нашем классе должны быть аналогичные методы. Начнем, как уже говорилось, с метода, позволяющего вычислить функцию sin(x). Заголовок метода сделаем такой же, как и в классе-аналоге, т.е. дадим процедуре-функции имя Sin. В результате программный код класса будет как на
рис. 4.1.2-13.

Option Explicit On

Option Strict On

Public Class ClassLibraryMath

'Константы класса

 Const EPS As Double = 0.000000001

'Статические методы класса

 Shared Function Sin(ByVal x As Double) As Double

    Dim a, res As Double

    Dim k As Integer

    a = x

    res = 0

    k = 0

'Основные вычисления

    Do While (Math.Abs(a) > EPS)

           res = res + a

           a = a * (-x * x / ((2 * k + 2) * (2 * k + 3)))

           k = k + 1

    Loop

    Return res

  End Function

End Class

 Рис. 4.1.2-13

Поставленная цель достигнута, - создан программный код, содержащий класс, метод которого позволяет вычислять по заданному аргументу x функцию sin(x).

Теперь вернемся к технической стороне дела. Построим Решение, содержащее проект, для чего в Главном меню среды выберем элемент Построение (Build) и выполним команду  Построить решение (Build Solution). В результате успешной компиляции будет построен файл с уточнением *.dll. Поскольку построенная сборка не содержит выполняемого файла, то непосредственно запустить наш проект на выполнение не удастся. Далее построим консольный  проект, к которому присоединим нашу библиотеку DLL, и протестируем, насколько корректно работают созданные нами методы. Заодно разберемся с тем, как строится консольный проект и как к нему подсоединяется сборка, содержащая DLL.

  1.  Создание консольного проекта – проекта  типа Console Application

Необходимо построить интерфейс, обеспечивающий конечному пользователю доступ к тем сервисам, которые предоставляет созданный класс ClassLibraryMath.  Начнем с построения простейшего интерфейса, позволяющего пользователю с консоли вводить исходную информацию – в нашем случае аргумент x. С исходными данными пользователь может провести вычисления, а затем полученные результаты вывести на консоль – экран дисплея.  Для организации подобного интерфейса и служит тип проекта – Консольное приложение.

Чтобы создать новый проект, находясь в среде разработки, вовсе не обязательно начинать со стартовой страницы. Достаточно выбрать элемент Создать (New) основного меню Файл (File) и выполнить команду Проект (Project), приводящий на страницу создания нового проекта. В этом окне зададим тип строящегося проекта – Консольное приложение, и дадим ему имя ConsoleToMath. Далее в поле Решение (Solution) выбрать элемент Добавить в решение, а в поле Расположение (Location) указать путь к папке, где находится наше Решение Дубль.

В консольном проекте стандартный модуль Module1 создается автоматически и содержит единственный статический метод – процедуру  Main( ).  Если этот проект запустить на выполнение, то начнет выполняться код этой процедуры, пока отсутствующий и который нам предстоит создать.

Когда проект запускается на выполнение, то в него должна входить сборка, отмеченная как стартовая, содержащая класс с точкой входа – статическим методом (процедурой)  Main( ). Дальнейший сценарий зависит от содержимого точки входа. Как правило, в процессе работы метода Main( ) создаются один или несколько объектов других классов, они и вызывают методы и/или обработчики событий, происходящих с созданными объектами. В этих методах и обработчиках событий могут создаваться новые объекты, вызываться новые методы и новые обработчики. Так, начиная с одной точки, разворачивается целый мир объектов приложения.

Далее в проект добавим соответствующий программный код (Рис. 4.1.2-14).

Option Explicit On

Option Strict On

Namespace ConsoleToMath'В данном случае можно опустить

  Module Module1

     Sub Main()

       'Входные данные

        Dim x As Double = 0

        Const INVITE As String = _

           "Введите вещественное число x" + _

            "- аргумент функции Sin(x)"

        Const CONTINU As String = _

            "Продолжим? (Yes/No)"

        Dim answer As String = "yes"

        Do'Организация ввода данных

               Console.WriteLine(INVITE)

               Dim temp As String = Console.ReadLine()

               x = Convert.ToDouble(temp)

              'Вычисления и вывод результата

               Dim res As Double = 0

               res = Math.Sin(x)

               Console.WriteLine("Math.Sin(x) = " + _

                   res.ToString())

               res = ClassLibraryМаth.ClassLibraryМаth.Sin(x)

               Console.WriteLine(" Sin(x)моей библиотеки = " + _

                   res.ToString())

              'диалог с пользователем

               Console.WriteLine(CONTINU)

               answer = Console.ReadLine()

       Loop While (answer <>"No")

     End Sub

  End Module

End Namespace

    Рис. 4.1.2-14

  1.  Связывание с DLL

Первым делом свяжем два построенных проекта, для чего в консольный проект добавим ссылку на проект с DLL ClassLibraryMath. Для этого в окне
Обозреватель решений  (Solution Explorer) подведем указатель мыши к имени консольного проекта и из контекстного меню, появляющегося при щелчке правой кнопки, выполним команду Добавить ссылку (Add Reference). В открывшемся окне добавления ссылок  выберем вкладку  Проект (Projects). Поскольку проект  ClassLibraryMath  включен в текущее Решение Дубль, то он автоматически появится в открывшемся окне. Если ссылку нужно установить на проект, не включенный в Решение, то в окне добавления ссылок нужно задать путь к проекту. Для  этого необходимо щелкнуть на вкладке Обзор и задать путь к проекту ClassLibraryMath, в папке …\bin\Relase\ClassLibraryMath.dll которого и находится нужный файл.   После этого добавления ссылка на DLL появится в папке Ссылки (References) консольного проекта. Теперь проекты связаны и из консольного проекта доступны сервисы, предоставляемые соответствующей библиотекой DLL.

  1.  Организация консольного интерфейса

Задача программного кода, который  непосредственно встроен в уже созданную процедуру Main( ), достаточно понятна. Дадим краткие комментарии к этому коду:

Входные данные устроены просто – задается лишь одна переменная x типа Double.

Вводу значения x предшествует, как и положено для хорошего стиля программирования, приглашение к вводу. Для ввода и вывода значений используются статические методы ReadLine( ) и WriteLine( )  класса Console, входящего в библиотеку FCL и предоставляющего свои сервисы пользователям консольных приложений. Для преобразования введенных данных, представляющих собой строки текста, к нужному типу (в нашем случае к типу Double) и для преобразования полученных результатов из числового типа Double в строковый тип String,  используются статические методы класса Convert, сервисы которого позволяют проводить различные преобразования между типами данных.

Значение функции Sin(x) вычисляется двумя разными методами – методом стандартного класса Math()и методом класса ClassLibraryMath.

В коде применяется стандартный прием зацикливания тела метода Main(), позволяющий пользователю самому решать, когда прервать выполнение метода.

Так как в нашем Решении Дубль на данный момент находится не один, а два проекта, то для того, чтобы выполнить консольный проект, необходимо именно его назначить запускаемым проектом. Для этого в окне Обозреватель решений  (Solution Explorer) подведем указатель мыши к имени консольного проекта и из контекстного меню, появляющегося при щелчке правой кнопки, выполним команду Назначить запускаемым проектом.

На Рис. 4.1.2-15показаны результаты работы консольного проекта.

Рис. 4.1.2-15.  Результаты работы консольного проекта

В этом рисунке нехорошо названа своя библиотека - у нас вместо MathTools.MyMath другое имя ClassLibraryMath. Надо или менять рисунок, или название своей DLL.

Анализируя эти результаты можно видеть, что два метода на всех исследуемых аргументах дают одинаковые результаты, совпадающие с точностью до 9 цифр после запятой. Точность методов в классе MyMath обеспечивается константой EPS этого класса. Достигнутая точность вполне достаточна для большинства практических задач. Остается понять, насколько написанные нами методы проигрывают методу стандартного класса по времени.  

Консолью называется окно операционной системы, в котором пользователи взаимодействуют с операционной системой или текстовым консольным приложением путем набора текстового ввода с клавиатуры и чтения текстового вывода с экрана компьютера. Например, в Windows консоль называется окном командной строки и принимает команды MS-DOS. Класс Console предоставляет базовую поддержку приложениям, считывающим символы с консоли и записывающим их на консоль.

Когда консольное приложение начинает работу, операционная система автоматически связывает с консолью три потока ввода-вывода. Приложение может считывать пользовательский ввод из стандартного входного потока, записывать обычные данные в стандартный выходной поток и записывать данные об ошибках в стандартный поток сообщений об ошибках. Эти потоки представлены в приложении значениями свойств In, Out и Error.

По умолчанию значением свойства In является объект System.IO..::.TextReader, а значениями свойств Out и Error – объекты System.IO..::.TextWriter.

Члены класса Console, работающие нормально, когда базовый поток направлен на консоль, могут выбрасывать исключение, если поток перенаправлен, например, в файл. Поэтому в приложениях следует перехватывать исключение System.IO..::.IOException, если стандартный поток перенаправлен.

Двумя тесно связанными между собой элементами консоли являются буфер экрана и окно консоли. Текст в реальности считывается из потоков и записывается в потоки, принадлежащие консоли, но кажется, что он считывается из принадлежащей консоли области, называемой буфером экрана, и записывается в эту область. Буфер экрана является атрибутом консоли, он организован в виде прямоугольной сетки строки и столбцов, в которой каждое пересечение строки и столбца, или символьная ячейка, содержит один символ. Каждый символ имеет собственный цвет, и каждая символьная ячейка имеет собственный цвет фона.

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

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

Началом координат сетки символьных ячеек в буфере экрана является его верхний левый угол, и позиция курсора в окне консоли измеряется относительно этого начала координат. Для указания позиции используются индексы, отсчитываемые от нуля, то есть самая верхняя строка, и крайний слева столбец имеют индекс 0. Максимальное значение индексов строки и столбца определяется значением свойства Int16..::.MaxValue.

Класс Console содержит методы для чтения с консоли отдельных символов или целых строк, а также несколько методов записи, автоматически преобразующие экземпляр типа значения, массив символов или набор объектов в форматированную или неформатированную строку и затем записывающие эту строку, а за ней необязательную строку, идентифицирующую конец строки данных. Также класс Console содержит методы и свойства, позволяющие получить или задать размер буфера экрана, окна консоли и курсора, изменить положение окна консоли и курсора, переместить или удалить данные в буфере экрана, изменить цвета фона и текста, изменить текст, отображаемый в строке заголовка консоли и воспроизвести звуковой сигнал.

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

Public Shared Sub Main()

  Console.Write("Hola ")

  Console.WriteLine("Mundo!")

  Console.WriteLine("What is your name: ")

  Dim name As String = Console.ReadLine()

  Console.Write("Buenos Dias, ")

  Console.Write(name)

  Console.WriteLine("!")

End Sub

  1.  Создание Windows проекта

Добавим в Решение новый проект, аналогично тому, как был добавлен консольный проект или можно применить другой способ. Для этого в окне Обозреватель решений  (Solution Explorer) подведем указатель мыши к имени Решения Дубль и из контекстного меню, появляющегося при щелчке правой кнопки, выполним команду Добавить, а затем в новом меню выберем команду Создать проект.

В качестве типа проекта выберем Windows-приложение, дадим проекту имя WindowsToMath.

Создадим простой интерфейс (рис. 4.1.2-16) и программный код класса Form1
(рис. 4.1.2-17).

Рис. 4.1.2-16.  Интерфейс формы класса Form1

Option Explicit On

Option Strict On

Public Class Form1

  Private Sub Button1_Click(ByVal sender As System.Object, _

            ByVal e As System.EventArgs) Handles Button1.Click

       Dim x As Double

       Dim temp As String

       temp = TextBox1.Text

       x = Val(temp)

      'Вычисления и вывод результата

       Dim res As Double = 0

       res = Math.Sin(x)

       TextBox2.Text = Convert.ToString(res)

       res = ClassLibraryМаth.ClassLibraryМаth.Sin(x)

       TextBox3.Text = Convert.ToString(res)

  End Sub

  Private Sub Button2_Click(ByVal sender As System.Object, _

             ByVal e As System.EventArgs) Handles Button2.Click

       End

  End Sub

End Class

Рис. 4.1.2-17.  Программный код  класса Form1

Для выполнения нашего Windows –проекта, необходимо точно таким же образом, как это было описано ранее для консольного проекта, во-первых, связать проект библиотеки классов ClassLibraryMath с созданным Windows –проектом WindowsToMath и, во-вторых, назначить Windows –проект WindowsToMath запускаемым проектом.

При создании консольного проекта автоматически создавался класс, содержащий метод Main( )с пустым кодом метода. В Windows - проекте автоматически создается класс с именем Form1.  Этот класс является наследником класса Form из библиотеки FCL и наследует все свойства и поведение (методы и события) родительского класса. Класс Form поддерживает организацию интерфейса пользователя в визуальном стиле. Форма является контейнером для размещения визуальных элементов управления – кнопок (Button), текстовых полей (TextBox), списков (ListBox) и более экзотичных элементов – таблиц (DataGridView), деревьев (TreeView) и многих других элементов. С некоторыми элементами управления мы уже знакомы.

Классы в VB синтаксически не являются неделимыми, а могут состоять из нескольких частей, каждая из которых начинается с ключевого слова Partial (частичный). Таковым является и построенный автоматически класс Form1. Возможность разбиения описания одного класса на части облегчает работу над большим классом. Каждая часть класса хранится в отдельном файле со своим именем. Одна часть класса Form1 хранится в файле с именем Form1.Designer.vb . Эта часть класса заполняется автоматически инструментарием, называемым Дизайнером формы. Когда мы занимаемся визуальным проектированием формы и размещаем на ней различные элементы управления, меняем их свойства, придаем форме нужный вид, задаем обработчиков событий для элементов управления, то Дизайнер формы транслирует наши действия в действия над объектами соответствующих классов, создает соответствующий код и вставляет его в нужное место класса Form1. Предполагается, что разработчик проекта не вмешивается в работу Дизайнера и не корректирует часть класса Form1, созданную Дизайнером. Тем не менее, понимать код, созданный Дизайнером необходимо, а иногда полезно и корректировать его. Другая часть класса Form1, хранящаяся в файле Form1.vb, предназначена для разработчика, - именно в ней располагаются автоматически создаваемые обработчики событий, происходящих с элементами управления, код которых создается самим разработчиком. Такая технология программирования, основанная на работе с формами, называется визуальной, событийно управляемой технологией программирования.

При создании  Windows-Приложений  (WindowsApplication)  и Консольных приложений (ConsoleApplication) программа (программный код проекта) на языке  VB    может состоять из программного кода, генерируемого средой разработки,  и программного кода,  написанного или дописанного программистом. Причем базовая структура программного кода проекта создается автоматически в тот момент, когда  пользователь выбирает в окне  Создание проекта (New Project)соответствующий шаблон. При выборе Windows-Приложения, базовая структура содержит модуль формы, а при выборе ConsoleApplication, базовая структура содержит стандартный модуль и метод Main( ) внутри модуля.

По мере усложнения приложений к ним могут добавляться модули классов,  стандартные модули, а если программа достаточно длинная,  в ней может быть  несколько форм и большое число процедур событий, которые используют одни и те же переменные и процедуры. Причем некоторый программный код можно выделить в отдельный программный код, который будет являться общим для всех. Такой программный код может быть частью  стандартного модуля. Кроме того, стандартные модули, так же, как и модули форм,  могут содержать  объявления переменных, констант и типов данных, описания общих процедур и  процедур обработки событий.


 

А также другие работы, которые могут Вас заинтересовать

66469. Оценка эффективности внешнеэкономической деятельности ОАО “ММК им. Ильича” 552.61 KB
  Маркетинг внешнеэкономической деятельности предприятия. Изучение возможностей предприятия. Задачи дипломной работы заключаются в следующем: проведение маркетингового изучения конкурентной среды предприятия; анализ потенциала предприятия...
66471. ОСНОВНЫЕ НАПРАВЛЕНИЯ ПОВЫШЕНИЯ ЭФФЕКТИВНОСТИ УПРАВЛЕНИЯ ПЕРСОНАЛОМ НА ПРЕДПРИЯТИИ 1.23 MB
  Одним из главных результатов современного этапа научно-технической революции стало превращение человека в главную движущую силу производства поэтому сегодня для организации ее персонал является основным богатством. В рамках этого подхода человек стал рассматриваться...
66472. Электронная открытка как инструмент обучения на уроках немецкого языка 52.11 KB
  Теоретические основы исследования электронных открыток немецко-язычной Интернет-коммуникации Общая характеристика Интернет-коммуникации Электронная открытка как вид Интернет-коммуникации. Особенности электронных открыток немецко-язычной Интернет-коммуникации.
66473. Система работы над изложением в старших классах школы восьмого вида 465 KB
  Обучение умственно отсталых школьников связной письменной речи является одной из актуальных проблем российской вспомогательной школы. Особую значимость приобретает реализация этой проблемы при обучении умственно отсталых детей умению связно и последовательно излагать свои мысли в устной и в письменной форме.
66474. Анализ деятельности учреждений социального обслуживания инвалидов (в частности в г. Самара) 31.56 KB
  В следствии мы исходим из гипотезы согласно которой социальная и правовая защита граждан инвалидов в стране находится на первоначальном этапе своего развития и отвечает сложившимися на данный момент социально-экономическими условиями. В структурном отношении работа состоит из двух частей...
66476. Оздоровчі можливості використання вправ художньої гімнастики в процесі фізичного виховання старшокласниць 785 KB
  Основними причинами стійкої тенденції зниження здоров'я у підростаючого покоління є: інформатизація та інтенсифікація навчального процесу в системі шкільної освіти на тлі вираженого психоемоційного напруження, низької рухової активності; зниження якості життя, обумовлене економічними труднощами і соціальними проблемами...