Обзор
В этой статье описывается, как вызвать .NET dll из приложения Clarion. По моему опыту, документация по Clarion скудна и часто устарела, поэтому цель этой статьи — предоставить более свежую информацию. Пожалуйста, не стесняйтесь оставлять отзывы или предложения о том, как все могло бы работать лучше.
Пример кода для этой статьи можно найти здесь.
Начиная
Если вы читаете это, значит, у вас должно быть общее представление о том, что такое Clarion и что такое .NET. У вас также должно быть довольно хорошее представление о том, почему вы пытаетесь заставить .NET и Clarion взаимодействовать, поскольку приведенные здесь примеры кода довольно просты.
Версии
Пример кода был написан с помощью Clarion версии 10.0 и .NET 4.7.2.
Предотвращение циклических зависимостей
Смешивание и сопоставление управляемых и неуправляемых dll может привести к беспорядку. Не ссылайтесь на Clarion из .NET и ту же библиотеку .NET из Clarion. Используйте обратные вызовы и указатели ссылок, чтобы поддерживать чистоту.
LIB Maker
Создатель библиотеки, поставляемый с Clarion, содержит несколько ошибок, и вам понадобится исправленная версия (доступна здесь) для решения этих проблем. Эта программа создаст файл .lib, который Clarion использует для сопоставления вызовов с вашей .NET dll.
Неуправляемый экспорт
Стандартный экспорт .NET не будет просто работать с Clarion, поэтому в вашем приложении .NET должен быть установлен пакет UnmanagedExports NuGet by Robert Giesecke. Это пакет времени компиляции, и он не требует никаких дополнительных файлов с вашим результатом.
Экспорт методов .NET
Сначала напишите класс и метод, которые вы хотите экспортировать, и я бы рекомендовал написать оболочку, содержащую экспортированные методы, чтобы сохранить чистоту. Экспортируемые методы должны быть статическими, поэтому их разделение позволяет лучше управлять памятью и очищать ее.
Обратные вызовы
Я обнаружил, что использование процедуры обратного вызова работает хорошо, хотя вы также можете использовать ссылочные переменные и, возможно, возвращать значение, хотя я еще не добился большого успеха в этом.
Чтобы использовать обратный вызов, объявите тип делегата в .NET и соответствующую процедуру в Clarion для получения обратного вызова. Затем эта процедура будет передана в .NET dll в качестве параметра.
.NET-проект
Сторона .NET довольно прямолинейна:
- Создайте новый проект библиотеки для платформы .NET.
- Установите цель сборки на x86
- Добавьте немного логики для действия, которое вы хотите выполнить
- Добавьте пакет NuGet UnmanagedExports.
- Напишите свои статические методы экспорта и любые необходимые вам делегаты
- Скомпилируйте проект
Кларион Проект
Со стороны Clarion вам нужно будет получить модифицированный LibMaker и запустить его против вашей .NET dll. Если все прошло хорошо, вы увидите свои экспортированные методы и сможете сохранить созданный им файл .lib в местоположении, к которому может получить доступ ваше приложение Clarion, вместе с файлами dll, которые создает и требует ваш проект .NET. Затем добавьте ссылку на сгенерированный файл .lib в свои приложения Clarion в разделе «Библиотеки, объекты и файлы ресурсов».
Затем запишите импорт .NET в карту вашего приложения Clarion.
Вызов методов .NET
Чтобы вызвать методы .NET, вы просто вызываете импортированный метод, как обычную процедуру Clarion:
Вывод
Хотя есть несколько особенностей и шагов, необходимых для того, чтобы заставить Clarion вызывать код .NET, это стоит затраченных усилий во многих сценариях, где вам нужна утилита .NET в приложении Clarion.