Работа с нативными dll библиотеками в C#

В процессе разработки программного обеспечения далеко не всегда достаточно собственных наработок. Чаще всего проект содержит те или иные сторонние библиотеки.

Очень многие из них не являются .NET сборками и предназначены для работы непосредственно в среде Windows. Но, к счастью, в .NET Framework существует удобный механизм, который позволяет интегрировать обычные Windows dll библиотеки в программные проекты на .NET языках. При этом C# не исключение.

Рассмотрим простой пример. Подключим библиотеку, написанную на C++, к программе на C#. В качестве примера воспользуемся библиотекой, которая была разработана ранее для работы с Delphi [1].

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

Механизм подключения предельно прост.

Вначале скопируем библиотеку в папку с программой или подключим её к проекту с указанием настройки копирования в выходной каталог «Копировать всегда» (в этом случае файл библиотеки будет добавляться в папку со скомпилированной программой автоматически).

После этого добавим директиву:

using System.Runtime.InteropServices;

Далее импортируем функцию из библиотеки при помощи атрибута DllImport.

[DllImport("Test.dll")]
private static extern int dllFunc(int a);

Важно отметить. Импортируемая функция обязательно должна быть статическим методом того или иного класса. При этом модификатор доступа (private, public и т.д.) можно устанавливать исходя из логики работы программы.

Собственно на этом процесс импорта и завершён. Функцию из библиотеки теперь можно использовать в программе.

private void buttonTest_Click(object sender, EventArgs e)
{
    outputNumber.Text = dllFunc(int.Parse(inputNumber.Text)).ToString();
}

Приведённый способ универсален и может использоваться для импорта функций из любых нативных библиотек. К слову, работа с функциями Win API в программах на C# строится именно по такому принципу [2].

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

Этот класс также можно вынести в отдельную dll библиотеку, но уже в виде .NET сборки. Таким образом, созданы .NET оболочки для многих популярных библиотек.

Источники
  1. C++ Builder. Написание dll библиотеки совместимой с Стрелец Coder;
  2. Using the DllImport Attribute. MSDN.
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *