Рейтинг@Mail.ru
PInvoker для Visual Studio
PInvoker для Visual Studio

Как быстро импортировать функционал динамической библиотеки в свой проект

автор:
Be the first to comment! Программирование
Print Friendly, PDF & Email

Часто перед .NET-программистом возникает задача: использовать функционал динамической библиотеки DLL, написанной другим разработчиком на неуправляемом коде. Подчас функционал этой библиотеки может быть весьма и весьма обширен. Вручную прописывать у себя в проекте каждый класс, функцию, константу и т.д. – очень долго. К счастью, существуют инструменты, частично автоматизирующие этот процесс. Об одном из них мы и поговорим.

Быстрый способ получения PInvoke определений кода C# и VB.NET для динамической библиотеки DLL

Как известно, приложение, написанное для среды .NET, не может напрямую использовать неуправляемый код. Для этого существует специальный механизм, который позволяет вызывать функции неуправляемого кода (unmanaged code) из приложений на управляемом коде (managed code), и называется этот механизм Platform Invocation Service, или PInvoke.

1Установка инструмента PInvoker

Если у вас есть динамическая библиотека *.dll, написанная на неуправляемом коде, например, на языке C или C++, а также её заголовочные (header) файлы, и вам нужно объявить в вашем проекте целую кучу конструкций из библиотеки, то очень хорошим решением для вас может стать инструмент PInvoker. PInvoker свободно распространяется в виде расширения для IDE Visual Studio (поддерживаются версии 2005, 2008 и 2010/2011), а также в виде отдельного приложения.

Работа с ним проста и удобна. PInvoker импортирует PInvoke определения для управляемого кода на C# или VB.NET из файлов заголовков C/C++ и связанной с ними библиотеки DLL. Вам останется лишь выбирать из списка доступных функций, структур, перечислений, констант, делегатов и проч. необходимые и импортировать в ваш проект.

Для начала, безусловно, нужно скачать и установить PInvoker. Скачайте с официального сайта установщик PInvoker.msi или расширение PInvokerAddin.msi для Visual Studio. Думаю, с этим проблем возникнуть не должно. Просто запустите нужный файл и следуйте инструкциям.

2Импорт определений PInvoke с помощью расширения PInvoker

Рассмотрим на примере, как работать с этим полезным инструментом. Запустите Visual Studio, создайте новый проект. В меню Сервис появился новый пункт: PInvoker Addin. Нажмите на него, и откроется окно настроек.

Запуск PInvoker Addin
Запуск PInvoker Addin

Выберите язык вашего проекта Language: C# или VB.NET. В выпадающем списке Profiles выберите <edit profiles>.

Редактирование профилей PInvoker
Редактирование профилей PInvoker

Откроется окно управления профилями. Выберите Create a new import profile и нажмите Next.

Создание нового профиля импортирования PInvoker
Создание нового профиля импортирования PInvoker

Теперь нужно добавить заголовочные header-файлы. Можете перетащить их мышью на окно PInvoker Profiles Wizard. Далее укажите директорию, где хранятся эти файлы.

Добавление файлов заголовков
Добавление файлов заголовков

На следующем шаге необходимо указать саму динамическую библиотеку. Её тоже можете смело тащить мышью на окно мастера профилей PInvoker.

Добавление динамической библиотеки DLL
Добавление динамической библиотеки DLL

После нажатия на кнопку Finish начнётся процесс импорта определений из выбранной динамической библиотеки. Об успешном завершении операции будет свидетельствовать надпись Import successful и появившийся в левом поле список названий функций из DLL.

Завершение настройки профиля импорта PInvoke определений из DLL
Завершение настройки профиля импорта PInvoke определений из DLL

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

Теперь вы можете с лёгкостью импортировать PInvoke определения в свой проект. В левом поле (1), в поле Type выберите тип: функция, процедура, структура, перечисление, константа, делегат и т.д. В поле Name выберите название нужной конструкции. По одинарному клику её описание появится в центральном поле окна PInvoker (2). По двойному – откроется её определение в хедер-файле. Нажав кнопку Insert definition (3), вы вставите определение в свой проект C# или VB.NET. Теперь вы можете пользоваться импортированной функцией динамической библиотеки в своём проекте.

Импорт PInvoke определений из DLL в проект Visual Studio
Импорт PInvoke определений из DLL в проект Visual Studio

Как и любой инструмент, PInvoker не является панацеей. Он тоже может ошибаться. Например, некоторым импортируемым типам могут быть присвоены типы .NET, не корректно совместимые с типами неуправляемого кода, и в этом случае маршалинг завершится неудачей.

За этим нужно следить и не поступать бездумно. PInvoker предлагает варианты при импорте для некоторых типов, членов, областей видимости и т.п. Нажмите мышью на подсвеченную фиолетовым цветом надпись – и увидите доступные варианты.

Настройки импорта PInvoke
Настройки импорта PInvoke

Замечание от 2022. Я заметил, что сайт PInvoker больше не работает или переехал. Поэтому прикладываю к статье архив с установщиками – расширение для Студии VS2010 и как отдельное приложение.

Download attachments:

Last modified onПятница, 05 Август 2022 20:39 Read 7161 times
Ключевые слова: :

Поблагодарить автора:

Поделиться

Print Friendly, PDF & Email

Leave a comment