Обзор

В этой статье описывается, как вызвать .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 довольно прямолинейна:

  1. Создайте новый проект библиотеки для платформы .NET.
  2. Установите цель сборки на x86
  3. Добавьте немного логики для действия, которое вы хотите выполнить
  4. Добавьте пакет NuGet UnmanagedExports.
  5. Напишите свои статические методы экспорта и любые необходимые вам делегаты
  6. Скомпилируйте проект

Кларион Проект

Со стороны Clarion вам нужно будет получить модифицированный LibMaker и запустить его против вашей .NET dll. Если все прошло хорошо, вы увидите свои экспортированные методы и сможете сохранить созданный им файл .lib в местоположении, к которому может получить доступ ваше приложение Clarion, вместе с файлами dll, которые создает и требует ваш проект .NET. Затем добавьте ссылку на сгенерированный файл .lib в свои приложения Clarion в разделе «Библиотеки, объекты и файлы ресурсов».

Затем запишите импорт .NET в карту вашего приложения Clarion.

Вызов методов .NET

Чтобы вызвать методы .NET, вы просто вызываете импортированный метод, как обычную процедуру Clarion:

Вывод

Хотя есть несколько особенностей и шагов, необходимых для того, чтобы заставить Clarion вызывать код .NET, это стоит затраченных усилий во многих сценариях, где вам нужна утилита .NET в приложении Clarion.