Варианты с неуправляемого на управляемый: соображения производительности

Предварительно: вызывающий объект — это собственный EXE-файл, который предоставляет тип «плагинной» архитектуры. Он предназначен для загрузки DLL (по имени, указанному в качестве аргумента командной строки). Эта DLL должна быть родной и экспортировать сигнатуру определенной функции. EXE - это C++, что не так уж важно, поскольку EXE - это черный ящик (не может быть изменен/перекомпилирован). Собственная библиотека DLL может удовлетворить потребности приложения, полностью реализовав решение в указанной библиотеке DLL. Однако требование состоит в том, чтобы разрешить кодирование реальной работы (таким образом превращая собственную DLL в тонкую оболочку/шлюз) на C#. Это приводит меня к 3 вариантам (если есть еще, поделитесь):

  1. Собственная библиотека DLL загружает библиотеку C++/Cli, которая внутренне использует библиотеку классов C#.
  2. Собственная DLL взаимодействует с COM-объектом C# через CCW
  3. Собственная DLL размещает CLR и вызывает сборку C#.

Еще одно требование состоит в том, что не только родной DLL нужен способ отправки сообщений (вызов функций) на C#, но и C# должен иметь возможность запускать события/обратный вызов в родную DLL, когда происходят определенные экстраординарные вещи (в отличие от выключение и возврат). Теперь это последнее, что я не уверен, как справиться с 3-м вариантом, но это совсем другой вопрос.

Итак, к делу: производительность. Любая информация об этих подходах (при условии, что все они соответствуют требованиям)? Из моего исследования я понимаю, что 2 будет иметь больше накладных расходов, чем 1, но я не уверен на 100%, поэтому я здесь. Что касается 3, у меня пока нет никакой информации.

Так что, если кто-то имел дело с этим (или знает другой элегантный вариант), пожалуйста, отзовитесь.

Спасибо!


person Community    schedule 30.04.2009    source источник
comment
Не знаю насчет производительности, но 1 точно самый простой. Влияние на производительность, вероятно, зависит от того, сколько данных необходимо маршалировать. Любая информация о количестве данных, которые необходимо перемещать из EXE ‹--› DLL?   -  person Steven    schedule 30.04.2009
comment
Связь в основном осуществляется от Native к Managed в виде частых небольших пакетов (256 байт + или -). Обмен данными от управляемого обратно к родному будет редким и очень короткими пакетами.   -  person    schedule 30.04.2009


Ответы (1)


Я делал вариант 1 раньше, с разумным успехом. Я не помню каких-либо значительных последствий для производительности, хотя мое приложение не было очень требовательным к производительности. Мне кажется, что если возникают проблемы с производительностью, вероятным виновником могут быть частые небольшие переходы с собственного на управляемый. Можно ли объединить их на уровне C++/CLI?

person Greg Fleming    schedule 30.04.2009