Рекомендация по оболочке C++ для кроссплатформенных внутрипроцессных динамических привязок библиотек (т.е.легкий, высокопроизводительный COM или CORBA) [закрыто]

StackOverflow https://stackoverflow.com/questions/1854323

Вопрос

Мы разрабатываем приложение, которое будет иметь подключаемую «архитектуру», позволяющую потребителям приложения предоставлять свои собственные алгоритмы.(По сути, у нас будет набор парсеров, и мы позволим третьим сторонам также предоставлять свои собственные)

Пространство домена требует очень высокой производительности, поэтому привязки вне процесса не будут работать, и мы предпочитаем оставить в покое такие тяжеловесные вещи, как CORBA и COM.

По сути, мы ищем простую кроссплатформенную оболочку для:

  • загрузить библиотеку по относительному пути
  • предоставить сопоставление конкретной dll/.so с некоторой конфигурацией/именем
  • выполните некоторую инициализацию и запросите библиотеку, чтобы убедиться, что она предоставляет необходимую функциональность

Я думаю, что на самом деле это просто оболочка loadlibrary() и экспортированных вызовов методов.Мы можем написать это сами, но мы предпочитаем использовать существующий код, поскольку у нас его достаточно.

Опять же, пропускная способность и производительность очень важны.

Похожие вопросы:

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

Кроссплатформенные динамические библиотеки C++;Линукс и Винда

Это для неуправляемого C++ — мы не можем использовать .NET.

РЕДАКТИРОВАТЬ - что мы нашли

Мы нашли это Поко отлично работает для наших нужд.В качестве бонуса Эта страница - это очень ценный комментарий о состоянии развития C++ и направлении языка...

Нам нужна была простая кроссплатформенная оболочка, которую предоставляет Poco.На самом деле в этом нет ничего особенного, но все же экономится время и время тестирования.Никаких дополнительных накладных расходов во время выполнения.

Это было полезно?

Решение 2

Я думаю, что это также может сработать:http://pocoproject.org/docs/Poco.SharedLibrary.html

Другие советы

А ТУЗ Библиотека содержит оболочки для динамической загрузки библиотек, которые работают кроссплатформенно.Если вам нужен больший комфорт, чем простая библиотека загрузки, посмотрите ТАО ШАР ACE.Использование Corba с TAO чрезвычайно производительно и, скорее всего, превосходит любую самостоятельно созданную инфраструктуру плагинов, особенно если вы используете ее в вызовах процессов, поскольку TAO их оптимизирует.

Чтобы использовать кроссплатформенную оболочку динамической библиотеки, используйте ACE_DLL.Он предоставляет самую простую кроссплатформенную оболочку для loadlibrary(), о которой вы упомянули.

Между использованием ACE_DLL и использованием TAO находится структура конфигурации сервисов ACE, который позволяет динамически загружать объекты.После загрузки вы можете получить указатель преобразования на загруженный объект, который вы реализовали, и можете вызвать любой метод загруженного объекта.

Код для этого будет выглядеть так:

char const * const cpc_myClass = ACE_DYNAMIC_SERVICE_DIRECTIVE(
  "myclass",
  "dllname",
  "_make_MyClass",
  ""
);
result = ACE_Service_Config::process_directive(cpc_myClass);
MyClass * p_obj = ACE_Dynamic_Service<MyClass>::instance ("myclass");
p_obj->callAnyMethodYouLike();

Здесь поясняется, что TAO знает два типа оптимизации колокейшн (thru_poa и Direct):

При использовании прямой стратегии вызовы методов совместно расположенных объектов становятся прямыми вызовами слуги без проверки статуса POA.

Вы можете быть удивлены, насколько эффективным может быть ТАО, если его правильно использовать.Я предлагаю создать простое доказательство концепции и провести измерения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top