В процессе разработки программного обеспечения далеко не всегда достаточно собственных наработок. Чаще всего проект содержит те или иные сторонние библиотеки.
Очень многие из них не являются .NET сборками и предназначены для работы непосредственно в среде Windows. Но, к счастью, в .NET Framework существует удобный механизм, который позволяет интегрировать обычные Windows dll библиотеки в программные проекты на .NET языках. При этом C# не исключение.
Рассмотрим простой пример. Подключим библиотеку, написанную на C++, к программе на C#. В качестве примера воспользуемся библиотекой, которая была разработана ранее для работы с Delphi [1].
Вкратце напомним, что эта библиотека содержи одну единственную функцию, которая возвращает целое число, которое было передано ей в качестве аргумента. Ссылка на статью с постановкой задачи и исходным кодом библиотеки приведена в конце данной статьи.
Механизм подключения предельно прост.
Вначале скопируем библиотеку в папку с программой или подключим её к проекту с указанием настройки копирования в выходной каталог «Копировать всегда» (в этом случае файл библиотеки будет добавляться в папку со скомпилированной программой автоматически).
После этого добавим директиву:
1 |
using System.Runtime.InteropServices; |
Далее импортируем функцию из библиотеки при помощи атрибута DllImport.
1 2 |
[DllImport("Test.dll")] private static extern int dllFunc(int a); |
Собственно на этом процесс импорта и завершён. Функцию из библиотеки теперь можно использовать в программе.
1 2 3 4 |
private void buttonTest_Click(object sender, EventArgs e) { outputNumber.Text = dllFunc(int.Parse(inputNumber.Text)).ToString(); } |
Приведённый способ универсален и может использоваться для импорта функций из любых нативных библиотек. К слову, работа с функциями Win API в программах на C# строится именно по такому принципу [2].
Как правило, работая с библиотекой, не ограничиваются одной функцией. При импорте нескольких функций целесообразно создать статический класс, который будет служить «обёрткой» для работы с функционалом данной библиотеки.
Этот класс также можно вынести в отдельную dll библиотеку, но уже в виде .NET сборки. Таким образом, созданы .NET оболочки для многих популярных библиотек.
Добавить комментарий