Добавил:
Developer Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

IT информатика / С# / Повторное использование кода

.doc
Скачиваний:
0
Добавлен:
02.01.2024
Размер:
56.32 Кб
Скачать

Повторное использование кода (DLL).

Материалы лабораторной работы (делай раз, делай два) по созданию приватной сборки (динамически подключаемой библиотеки DLL) и пример ее использования в исполняемой сборке (в оконном режиме).

Все проекты, которые Вы создавали то сих пор, состояли только из одной сборки (исполняемого файла с расширением .exe). Это удобно с точки зрения переносимости, ведь весь код находится в одном файле. Достаточно передать этот файл пользователю, и он сможет запускать его на выполнение. Конечно при условии, что на его компьютере установлена платформа .NET.

Однако с точки зрения повторного использования кода это неудобно. Почему? Для того, чтобы сделать этот исполняемый файл, весь код приложения нужно иметь в виде исходного текста. Если от приложения к приложению используются одни и те же классы, то придется их писать в виде исходного кода во всех приложениях. Это нехорошо по нескольким причинам:- придется писать (или копировать) один и тот же код много раз, но это полбеды, а представьте себе ситуацию, в которой в какой-то момент Вы внесли в эту общую часть для всех проектов изменения. Что дальше? Придется перекомпилировать все проекты, в которых используются эта общая часть? Это фактически невозможно. Получится, что в некоторых приложениях будет работать одна версия общей части, в другой другая. Будет каша.

Встает вопрос: можно ли вынести некоторый код из приложения, отдельно его откомпилировать и в дальнейшем подключать к приложению, не внося изменений в код самого приложения? Можно! Для этого используются сборки в виде динамически подключаемых библиотек (DLL).

Что для этого нужно? Для этого надо сделать (откомпилировать) такую DLL. Затем надо запустить приложение, в котором будет использоваться эта DLL. В некоторый момент его работы DLL-ка подключиться к нему и будет работать. Конечно, придется организовать приложении так, чтобы оно «знало», что во время работы надо подключать динамическую библиотеку.

Если в дальнейшем в исходный код DLL будут внесены изменения, то надо будет всего лишь заново её откомпилировать и заменить старую версию на новую. При этом само приложение заново компилировать не потребуется.

Чего мы этим добьемся? Общую часть для нескольких приложений сделали? – Сделали.

При изменении кода в подключаемой библиотеке код самого приложения может быть и не надо будет менять. И это сделали.

Что еще получилось? Оказывается, платформа .NET и механизм DLL устроен так, что исходный код библиотеки может быть написан на любом языке платформы .NET и использоваться любым языком этой платформы. Более того, можно организовывать потомки от классов, объявленных в библиотеках, не обращая внимания на язык, на котором написан предок.

В этой лабораторной работе описан способ организации сборки в виде DLL-ки и простой вариант ее подключения к другой сборке, представленной в виде исполняемого файла (exe).

Итак, давайте для начала создадим библиотеку. Для этого запускаем среду. Выбираем меню File|New|Project (Файл|Создать|Проект). Выбираем язык программирования Visual C#|Windows и выделяем Class Library (Библиотека классов). Используя кнопку Browse(Обзор) сделайте так, чтобы Ваш проект был расположен в папке именем БРТ_DLL. Внизу окна введите Name Library(Имя для библиотеки) StudLibrary. Нажимаете OK. Получаете новый проект, который очень похож на консольное приложение. В проекте только один файл Class1.cs, в котором объявлен пустой класс Class1. В этом классе нет метода Main(), который должен запускаться первым при старте приложения. Почему? Это же не приложение, а библиотека и она не будет запускаться независимо. Попробуйте скомпилировать проект. В папке bin/Release или в bin/Debug должен появиться результирующий файл с расширением .dll – StudLibrary.dll. Сделали «пустую» DLL.

Заполняем его содержанием. Организуем в ней класс, в котором будет храниться информация о студенте: его имя, группу и год рождения. Класс имеет имя Stud.

Переименуем файл Class1.cs в Stud.cs и организуем там класс, в котором будут три закрытых поля и три свойства, которые записаны в сокращенном виде. Закрытые поля из-за того, что свойства записаны в сокращенном виде, даже не требуют явного описания. Пространству имен (namespace) дадим имя StudLib;

Файл Stud.cs должен иметь следующий вид:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace StudLib //пространство имен

{

public class Stud // класс

{

public String Name { get; set; } // свойство в упрощенном виде

public String Gruppa { get; set; }

public int GodR { get; set;}

}

}

Откомпилируйте проект.

Все, библиотека с именем StudLibrary.dll создана. В ней описано пространство имен StudLib, в котором есть класс Stud.

Теперь надо эту библиотеку подключить к какому-нибудь проекту.

Напишем тестовое простенькое Window-приложение с одной кнопочкой, в обработчике которой инициализируем объект класса Stud из нашей библиотеки. Если после запуска приложения при нажатии на кнопочку не будет выдано сообщений об ошибках, значит объект создан и с ним можно работать. Это и будет нашим тестом. В дальнейшем в классе Stud можно написать метод, в котором будет организована работа с полям.

Итак, что надо сделать в простеньком приложении? Кроме стандартных действий при создании Windows-приложения его необходимо настроить так, чтобы при его работе была возможность использовать подключаемую библиотеку.

Для этого сначала сделайте так, чтобы ваше простенькое приложение с именем WinForm_DLLTEST лежало в другой папке, ну, например, в папке БРТ_DLLTEST. Далее подключите к нему сделанную DLL-ку. Для этого в пункте главного меню Project (Проект) выберите пункт Add Reference (…Добавить ссылку…). Откроется окно Add Reference (Добавить ссылку), в блокноте этого окна выберите страничку Browse (Обзор) найдите требуемую DLL, выберите ее, в строке Имя файла появится имя выбранной DLL StudLibrary. Нажмите OK. Все, подключили DLL-ку к нашему проекту.

Вернемся к форме нашего проекта. Повесьте на нее кнопочку Button1. Откройте обработчик события button1_Click и инициализируйте в нем объект класса Stud. Вот так:

private void button1_Click(object sender, EventArgs e)

{

Stud st = new Stud();

}

Попробуйте откомпилировать (запустить проект). Что, не получается? Компилятор сообщает, что не находит тип или пространство имен с именем Stud. Конечно, библиотеку то к проекту подключили, а пространство имен подключили? Нет. Как это сделать? К предложениям using… добавить еще одно using StudLib;

Весь код файла Form1.cs будет иметь следующий вид:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using StudLib; //подключили пространство имен

namespace WinFormsDLLTest

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

Stud st = new Stud();

}

}

}

Обратите внимание, что подключаем именно пространство имен StudLib, а не DLL-ку с именем StudLibrary.

Вот теперь компиляция должна пройти успешно и проект можно запустить на выполнение. Запускайте, давите кнопочку, ничего не происходит? Это хорошо! Ведь никаких сообщений об ошибках не выдается. Значит объект st инициализирован и с ним можно будет работать.

Это не все. Зайдите в папку bin/Release или в bin/Debug проекта WinFormDLLTest. Там появился файл StudLibrary.dll.

Вы сделали DLL, которая называется приватная сборка. Она должна находиться в той же директории, что и исполняемый файл. За корректную работу библиотеки в этом случае отвечает программист, система не следит за ее версиями.

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

И это еще не все.

Есть такой вопрос: что нужно передать пользователю, чтобы приложение было работоспособным? Сейчас выясним. Создайте папку UserDLL вне двух уже имеющихся директорий с двумя уже разработанными приложениями. Скопируйте туда две сборки, которые лежат в директории bin/Release или в bin/Debug тестового проекта из папки БРТ_DLLTest: файлы WinFormsDLLTest.exe и StudLibrary.dll. Запустите исполняемый файл. Должен запуститься. Нажмите кнопочку. Ничего не происходит, значит объект инициализирован и все в порядке – DLL-ку подключили.

Дальше – переименуйте DLL-ку – поставьте впереди именем «_» ( имя станет _StudLibrary.dll). Теперь это другая DLL. Запустите приложение – запускается. Это хорошо. Нажмите кнопочку – выдается сообщение об ошибке. Такими действиями выяснили, в какой момент работы приложения подключается динамически подключаемая библиотека – в момент первого требования данных, объявленных в ней.

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

Соседние файлы в папке С#