Использование COM DLL в C # - PullRequest
       33

Использование COM DLL в C #

3 голосов
/ 05 ноября 2010

У нас есть COM dll, который был написан на C ++ и использовался приложениями, написанными на vb 6.0.Моя компания планирует написать более новые версии приложений на платформе .Net.

Что касается производительности, то при использовании COM dll в проекте C #, что я должен выбрать из 3 вариантов, перечисленных ниже

  1. Просто добавление dll в качестве ссылки на ком
  2. Написание dll-оболочки с C ++ / Cli
  3. Создание dll-оболочки с использованием TlbImp.exe

Или есть еще варианты?
Спасибо.

Ответы [ 4 ]

3 голосов
/ 05 ноября 2010

Написание оболочки в C ++ / CLI вряд ли будет быстрее, маршаллер взаимодействия COM в CLR сильно оптимизирован.Он автоматически генерирует заглушки машинного кода из библиотеки взаимодействия, которую вы создаете, когда добавляете ссылку на COM-сервер.А выполняет намного больше работы, которая довольно незаметна и очень трудна для вас, связанная с исключениями.

Он гарантирует, что ошибки HRESULT правильно преобразованы в управляемые исключения и что управляемые исключения не могут проникнуть в код COM-сервера.Решение «сделай это быстро», которое вы получите, когда вы сделаете это, заставит вас срезать углы вот так.Теперь у вас есть что-то быстрое, но ненадежное.Получение управляемого исключения в неуправляемом коде крайне сложно диагностировать, весь контекст пропал.

Опции 1 и 3 - это одно и то же.Оба генерируют библиотеку взаимодействия, IDE просто запускает эквивалент Tlbimp для вас.

Здесь применимо обычное руководство.Сделайте сначала простую вещь, библиотека взаимодействия невероятно проста.Размышляйте над тем, чтобы сделать действительно сложную вещь, когда вы действительно можете измерить безупречные задачи и , у которых есть реальное представление, что с этим делать.Я никогда не видел, чтобы кто-нибудь решал, что C ++ / CLI-оболочка необходима.

1 голос
/ 05 ноября 2010

Поскольку компонент использует COM, будет проще всего добавить его в качестве ссылки и позволить Visual Studio создавать прокси. Это будет очень прямолинейно и прозрачно для кода .net. Это будет не так эффективно, но, скорее всего, это будет соответствовать вашим потребностям. Сначала я бы сделал это, так как это так просто, а потом посмотрю, как это работает.

Если бы компонент был не компонентом COM, а просто стандартным c ++ dll, тогда два других метода, вероятно, были бы лучшим выбором.

1 голос
/ 05 ноября 2010

Вариант 2 более производительный, но не очень, особенно с учетом того, что сама DLL находится в VB6.

Не уверен, что вариант 3 работает вообще.

Я бы лично использовал вариант 1, но просто сохранял взаимодействие где-нибудь в безопасности, чтобы я просто продолжал использовать одно и то же взаимодействие и не создавал его каждый раз, когда добавляю ссылку.

Другой вариант - использовать новые функции dynamic и позднее связывание (используя Activator для создания объекта), но это определенно менее производительно.

0 голосов
/ 05 ноября 2010

Вызов COM медленный из-за сортировки данных.Я имею в виду медленный, по сравнению с вызовом, когда вы не пересекаете управляемую или COM-границу.

Если вам нужно сделать много небольших вызовов к вашему COM-компоненту, в критически важной для вашего приложения части,Вы могли бы обернуть (и объединить) их с C ++.

Если количество вызовов минимально, или когда они не критичны по производительности (но не критичны ли по производительности все вызовы?), я бы просто добавил ссылкуCOM dll.

Сводка Перейти к ссылке на COM dll и проверить производительность.Поскольку вы переходите с VB6, вы уже получите огромный прирост производительности (обработка строк в .Net оооочень намного быстрее).

...