Поговорим о динамическом подключении библиотек dll (Dynamic Link Library) к программе, разрабатываемой на языке программирования C#. Рассмотрим пример написания консольного клиента для dll-файла.
Динамическое подключение dll происходит во время выполнения программы, в том месте, в котором действительно необходимо использовать функции из библиотеки. Вызов будет осуществляться явно, при выполнении определенного оператора. Статическое же подключении dll происходит сразу при запуске программы, поэтому, подключая библиотеку dll динамически, мы экономим ресурсы компьютера при выполнении нашей программы.
В статье «Как создать dll в Visual Studio» рассказывалось, как создавать dll-файлы, в частности и на языке C# (если вы не знаете как создавать dll, рекомендуем почитать ту статью). Там мы написали библиотеку dll, содержащую два метода: add и sub, которые складывают и вычитают два целых числа. Теперь разработаем консольный клиент для этой dll, продемонстрируем динамическое подключение этой библиотеки.
Сначала создадим в Visual Studio консольный проект на языке C#, и поместим в папку проекта Debug файл «dllcsharp.dll».
Перейдем к разработке программы. Для подключения dll нам понадобился пространство имен System.Reflection. Включим его в проект.
1 |
using System.Reflection; |
Пишем функцию main(). Загружаем dll-файл. Для этого необходимо создать объект класса Assembly.
1 |
Assembly a = Assembly.Load("dllcsharp"); |
Создаем новый объект класса и новый тип, используя название класса из библиотеки dllcsharp.dll.
1 2 |
Object o = a.CreateInstance("vscode"); Type t = a.GetType("vscode"); |
Для вызова метода из библиотеки используется метод Invoke(Object, Object[]), аргументы которого, это — объект класса, для которого вызывается метод и Object[] — это аргументы, передаваемые в вызываемый метод.
Например, будем складывать числа 2 и 3. Определим их в программе.
1 2 3 |
Object[] numbers = new Object[2]; numbers[0] = 2; numbers[1] = 3; |
Получим метод add из библиотеки dll.
1 |
MethodInfo mi = t.GetMethod("add"); |
Выполним его и выведем результат в консоль.
1 |
Console.WriteLine(mi.Invoke(o, numbers)); |
То же самое проделаем и с методом sub.
1 2 |
mi = t.GetMethod("sub"); Console.WriteLine(mi.Invoke(o, numbers)); |
В итоге получится вот такая программа:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; namespace dllclientcsharp { class Program { static void Main(string[] args) { Assembly a = Assembly.Load("dllcsharp"); Object o = a.CreateInstance("vscode"); Type t = a.GetType("vscode"); Object[] numbers = new Object[2]; numbers[0] = 2; numbers[1] = 3; MethodInfo mi = t.GetMethod("add"); Console.WriteLine(mi.Invoke(o, numbers)); mi = t.GetMethod("sub"); Console.WriteLine(mi.Invoke(o, numbers)); //чтобы консоль мгновенно не закрылась Console.ReadLine(); } } } |
Демонстрация работы приложения представлена на рисунке ниже:
Если вы хотите скачать исходник программы, написанной в этой статье, то нажмите на кнопку:
Скачать исходник
Поделиться в соц. сетях:
А каким образом можно подключить dll, которая находится в другой папке, отличной от папки с программой? То есть в папке с программой есть другая папка — Lib. Как сделать чтобы библиотека грузилась оттуда?
Разобрался, больше нет вопроса.
Как Вы это сделали?
А вот в первом уроке вы писали библиотеку на С. Её можно как нибудь к С# подключить?
Сам никогда так не делал, но можно. Погуглите по слову PInvoke.
столкнулся с такой проблемой, что t = null. Как и следовало ожидать — консоль встаёт.
Проверьте, правильно ли указаны имя библиотеки и имя класса.
Проверял, даже потом решил скопипапстить, как dll, так и консольный код — не помогло.