Это статья про программирование. В предыдущей статье мы узнали как написать и использовать свой класс с набором методов. В этой - познакомимся с инструментом, который позволяет использовать один раз написанный класс в других программах.
Если же Вы хотите научиться создавать программы для Windows, но совсем не знаете с чего начать, то с этой статьи.
Зачем нужны DLL
Представьте себе случай, что какой-то класс или метод написанный в одной программе может понадобиться в другой. Первое что приходит в голову - это просто скопировать необходимый программный код. Но есть вариант получше: вынести всё необходимое в отдельный файл .cs и добавлять его в проект. Но если Вы не хотите делиться с кем-то своим кодом, но есть необходимость, чтобы он использовал написанный Вами функционал? Тогда можно написать динамическую библиотеку классов (DLL), скинуть разработчику основного модуля, а он подключит её к своему проекту.
Ещё DLL бывают удобны когда Вы хотите использовать в множестве программ различные наборы классов и методов, написанных Вами. Например, Вы занимаетесь программами, анализирующими тексты, Вы описали 50 классов ("предложение", "фраза", "словосочетание"...) и 300 методов ("узнать насколько отличаются", "изменить смысл на противоположный"...). Каждая из Ваших программ использует только некоторые из этих методов, а некоторые классы используются всеми программами. Если на компьютере будут запущены даже сотни программ, использующих Вашу DLL, в память ОС Windows она будет загружена всего один раз. И да, DLL - это механизм ОС Windows, почти во всех других ОС есть аналогичные библиотеки, но именно DLL работать не будет.
Дополнительное удобство даёт возможность независимого обновления программ и DLL (правда это частенько выходит боком из-за несовместимости версий, но с собственными DLL такого почти не бывает).
Хороший стиль комментирования программного кода
Когда программа вырастает из одного модуля, то простых вариантов комментирования (// и /* */) становятся уже не достаточно.
Чтобы при вызове метода Visual Studio писал подсказку по параметрам этого метода, поставьте /// перед его объявлением - и вам будет сгенерирован шаблон комментариев с тегами summary и param.
В summary напишите что делает ваш метод, а в param - что за входные параметры вы хотите увидеть. Если ваш метод может вызвать ошибку, то опишите её причину в теге exception. Если ваш метод что-то возвращает, то используйте тег returns. Для самого класса описание также следует писать в summary, а для описания полей использовать тег value. Свои названия тегов тоже можно использовать, но лучше так не делать. Документацию по рекомендованным тегам можно найти на официальном сайте.
В проектах, которые разрабатываются большим числом программистов правильно оформленные комментарии автоматически собираются в сайты с документацией по модулям. Это облегчает работу девопсу при подготовке контейнеров, в которых будет всё необходимое программисту для выполнения конкретной задачи. А также просто помогает понять где что сотруднику, который недавно начал работать над проектом.
Даже если ваша DLL (или другая библиотека или модуль) предназначена для русскоязычных программистов, в коллективе может быть принято комментировать на английском языке. Так что может быть полезным потренироваться в английском и на своём проекте.
Как сделать свою DLL на C#
В меню Файл->Создать->Проект есть шаблон приложения "Библиотека классов (.Net Framework)". В интерфейсе на английском "Class Library (.Net Framework)".
Решения в C# и Visual Studio
Решения - это группа проектов, объединённых одними и теми же настройками среды разработки (Visual Studio). Если создать DLL в новом решении, то собирать библиотеку одновременно с программой нельзя будет и придётся переключаться между проектами. Красивые комментарии из другого решения тоже не будут видны. Добавить другой проект в текущее решение можно в любой момент, так что это просто вопрос удобства и больше ни на что не влияет.
Многие программисты создают для каждого собственного класса (и его наследников) отдельную DLL, что конечно же является хорошей практикой и одним из приёмов декомпозиции. Но при таком стиле для того, чтобы не запутаться надо придерживаться строгой собственной иерархии названий (нэймспейсов) проектов в решении. Для удобства создавать новый проект (в этом случае DLL - это просто шаблон проекта) можно сразу в обозревателе решений (Solution Explorer)->Решение(Solution)-> Добавить(Add)->Новый проект(New Project). А затем во всех проектах из решения кто будет использовать эту библиотеку классов: Зависимости (Dependencies)->Добавить ссылку на проект (Add Project References) и там поставить галочку.
Вернёмся к примеру. Переименуем имя класса по-умолчанию в нужное нам, добавим необходимый функционал. Я создам Dll с названием EasyPing: в нём один статический класс с таким же названием EasyPing и один обычный PingTasker.
Подключение своей DLL к новому проекту C# и её использование
Полученный файл с расширением DLL скопируем в папку с проектом, который будет её использовать. В Обозревателе решений (Solution Explorer) нажмём правой кнопкой на пункт Зависимости (Dependencies) и выберем Добавить ссылку на проект (Add Project References). С помощью кнопки "Обзор" выберем нашу DLL (из папки текущего проекта) и нажмём "ОК".
Для того чтобы создать экземпляр нестатических классов достаточно просто написать EasyPing.PingTasker имя_экземпляра. Либо подключить пространство имён EasyPing с помощью директивы using.
Чтобы использовать статические классы (и его статический метод IsIp) из Dll надо использовать директиву using static.
using static EasyPinger.EasyPinger;
using EasyPinger;
...
PingTasker a;
a.Add(IsIp(s));
После сборки приложения файл DLL должен так и находится в папке с программой. Если надо чтобы одну и ту же библиотеку использовали разные программы, то в зависимости от ситуации (прав пользователя) библиотеку можно установить в ОС либо использовать не папку проекта, а "%ALLUSERSPROFILE%/папка_вашей_программы".
Подключение DLL, написанной на другом языке (C++)
Часто необходимая вам DLL написана когда-то кем-то на C++ и её легко найти в интернете. Для использования функции из такой библиотеки надо использовать специальный класс DllImportAttribute и знать заголовок нужной нам функции.
Если её программист предусмотрел использование только функций (как в языке программирования C) и приложил к скачиваемой DLL её текстовый вариант (файл .h), то в C# проблем не возникнет - иначе предстоит долгий поиск информации в интернете.
Названия и заголовки функции из стандартных библиотек ОС Windows (например user32.dll) легко найти поиском на официальном сайте Microsoft или различными утилитами для просмотра экспортных функций любой DLL.
_______________________
В предыдущей заметке был и рассмотрены отличия между параллельностью, асинхронностью и многопоточностью. В следующей статье покажу на примерах работу программы с базой данных.
#c# #.Net #dll #программирование