Необходимо «обернуть» SDK на основе C ++ dll / h / lib / xml / exe в COM для использования в проекте C # 2.0 - PullRequest
1 голос
/ 06 января 2009

Я только что получил SDK, сделанный из C ++ dll, lib, exe и различных .h файлов. Я предполагаю, что это предназначено для разработчиков C ++. Все примеры проектов, которые они предоставляют вместе со своей документацией, написаны на C ++. Я могу раскрутить их с помощью Visual Studio 8 (2005) и запустить их. Они действительно управляют устройством, как рекламируется. Однако проект, которым это нужно использовать, находится в C # .Net 2.0, и его нельзя изменить.

Мой начальник был разработчиком C ++ и говорит, что все, что мне нужно сделать, это скомпилировать его как объект COM, а затем импортировать объект COM в мое решение C #. Мой начальник говорит, что для «обертывания» SDK в качестве COM-объекта может потребоваться меньше часа, даже если я не знаю, как компилировать C ++.

Ранее я использовал COM-объекты в решениях C #, поэтому, как только это будет сделано, я смогу продолжить без проблем.

Однако я не знаю, что делать для создания COM-объекта из 2 .dll-файлов, 1 .exe, 1 .lib-файла, 1 .xml-файла и 12 .h-файлов. Есть ли доступный ресурс, чтобы сказать мне, что нужно сделать, чтобы это произошло?

Ответы [ 7 ]

3 голосов
/ 06 января 2009

Мой начальник был разработчиком C ++ и говорит, что все, что мне нужно сделать, это скомпилировать его как объект COM, а затем импортировать объект COM в мое решение C #.

Это правда, однако компилировать его как COM-объект "сложно" (под этим я имею в виду, что вы не можете сделать это), если он уже не реализует API-интерфейсы COM (если это не так затем вам нужно реализовать API-интерфейсы COM, прежде чем вы сможете построить его как объект COM).

Существуют книги (например, Essential COM ), которые объясняют, как создавать COM-объекты с использованием C ++, но это не тривиально (для создания COM-объектов могут быть книги лучше, чем Essential COM и инструменты лучше / проще, чем C ++).

Я думаю, что у вас и / или вашего босса есть 3 варианта:

  1. Попросите продавца передать их вам как COM-объекты
  2. Разработка COM API, который обернул бы API SDK. Создайте COM-проект (на выбранном вами языке), который экспортирует этот API. Реализуйте эти API, вызывая базовые методы SDK. Для этого вам может понадобиться кто-то, кто знает C ++ или готов потратить много, гораздо больше, чем «час» на этот проект.
  3. Забудьте об использовании COM; вместо этого соберите SDK как DLL и используйте PInvoke для его вызова из кода .NET.

Мой начальник говорит, что для того, чтобы "обернуть" SDK в качестве COM-объекта, потребуется меньше часа, даже для меня, не имеющего знаний о компиляции C ++.

Судя по тому, что вы сказали, я не знаю, как это сделать.

1 голос
/ 06 января 2009

Скажите своему боссу, что если на его завершение потребуется меньше часа, он, безусловно, должен это сделать: это будет более эффективным использованием вашего времени.

Я бы также предложил ATL (не используя атрибуты), но это то, что может занять некоторое время, чтобы получить права, если у вас нет опыта.

0 голосов
/ 06 января 2009

Я (ну, действительно, мой лидер и я) сначала попытаюсь использовать p / Invoke (через функцию DllImport System.Runtime.InteropServices) против dll SDK, предоставленного компанией. Я дам вам знать, как это происходит.

0 голосов
/ 06 января 2009

Хорошо, что код компилируется и запускается для вас. Тем не менее, совершенно несправедливо полагать, что вы можете сделать это за час.

Вы проверили, чтобы увидеть, что на самом деле строится Visual Studio. Может быть шанс, что он уже строит COM-объект.

Исследуйте, как вызывается код. Я предполагаю, что у вас есть .exe, который вы можете запустить для проверки кода. Пройдите через это в отладчике VC ++ (это достаточно похоже на отладку кода C #) и попробуйте определить любые вызовы API, которые соответствуют вашим документам / ожиданиям. Эти знания будут полезны, если вы попытаетесь пойти по пути P / Invoke.

Что еще нужно рассмотреть, это SWIG . Обычно это используется разработчиками Python для переноса кода на C / C ++ и обеспечивает некоторую поддержку C #.

Управляемый маршрут C ++, вероятно, более полезен для опытных разработчиков C ++, потому что вам нужно много разбираться в распределении памяти для всего, кроме самого простого кода.

0 голосов
/ 06 января 2009

Это не совсем отвечает на ваш вопрос, но ...

Один из вариантов вместо создания COM-объекта - использовать P / Invoke и просто вызывать методы в DLL.

В этой теме на форумах MSDN описано, как создать библиотеку DLL для вызова с помощью P / Invoke.

Конечно, если вам нужен доступ ко всему классу (и создать экземпляр указанного объекта), это не поможет.

0 голосов
/ 06 января 2009

Мой босс говорит, что это должно занять меньше, чем час, чтобы "обернуть" там SDK как COM объект, даже для меня нет знание компиляции C ++.

Это может быть верно для опытного разработчика C ++ / COM, но не для начинающего. Я думаю, что вам лучше всего использовать ATL. Взгляните на MSDN учебник .

И не используют атрибуты.

0 голосов
/ 06 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...