Преобразование COM-объекта c ++ vb6 в точечную сеть - PullRequest
0 голосов
/ 09 ноября 2010

У меня есть COM-объект в C ++ и VB6, и все компилируется и упаковывается с использованием Visual Studio 2003. C ++ генерирует DLL, а VB6 - EXE, поэтому из старого кода я могу вызвать EXE, который вызывает DLL, на.

Мне нужно перенести их в Visual Studio 2008. Однако у меня есть несколько вопросов

1) Я могу скомпилировать C ++ и сгенерировать DLL - (я думаю, все в порядке) 2) VB.Net больше не имеет возможности генерировать COM / ActviveX как VB6, так что понятия не имею - Я пытался сгенерировать Windows EXE и вызвать DLL, но это не работает. Я думаю, потому что он имеет несколько COM-вызовов.

Так что же является лучшим решением, чтобы избавиться от COM / ActiveX и доставить что-то?

Компиляция в C ++ и загрузка добавления ссылок в VB.net? Я пробовал это, но DLL не загружается .........

Ответы [ 3 ]

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

Хорошо, похоже, у вас небольшое недоразумение..net - это среда, совершенно отличная от COM / VB.Это то, что называется неуправляемым кодом, тогда как .net управляется.Вы можете звонить от одного к другому, используя что-то под названием InterOp (и есть много типов этого).

Первый vb6 - чтобы преобразовать это в .net, вам нужно перекодировать приложение..net не VB.Хотя языки похожи.

.net не активен X тоже.Вы не можете просто перекомпилировать c ++ dll (com или иным образом в .net).Однако существует специальная версия C ++, называемая управляемым C ++, которая находится между управляемым и неуправляемым кодом.

У вас есть следующие опции:

  1. Перекодировать программу VB и использовать COM InterOp с vb.net для доступа к существующему объекту COM
  2. Перекодировать программу VB иперекодировать функциональность COM (либо Managed C ++, либо перекодировать в VB.net), чтобы полностью .net
  3. Выйдите из программы VB и перекодировать функциональность COM (либо Managed C ++, либо перекодировать в VB.net) в полностью .net ииспользуйте возможность .net для предоставления интерфейсов COM.
  4. Оставьте все в покое
1 голос
/ 09 ноября 2010

Звучит так, как будто ваша C ++ DLL - обычная DLL (не COM), и она была доступна для VB6 с помощью операторов Declare.

У вас есть два варианта.

  • Вы можете вызывать C ++ DLL напрямую из .Net, используя P / Invoke .Никаких изменений кода не потребуется для C ++, вы можете использовать существующую DLL.Вы можете использовать P / Invoke Interop Assistant для автоматической генерации кода P / Invoke из заголовков вашего C ++.
  • Если вы хотите изменить C ++, вы также можете использовать C ++ Interop , который, предположительно, менее утомителен для реализации.
1 голос
/ 09 ноября 2010

Вы не уточнили, является ли код VB внепроцессным COM-сервером или клиентом, использующим COM-объект in ++ для C ++.

Если код VB является клиентом, вы можете использовать его для сборки как исполняемый файл VB.Net с ссылкой COM на coclass или если вы не хотите, чтобы объект C ++ регистрировался во время сборки, вы можно использовать инструмент TlbImp в библиотеке типов, чтобы сгенерировать управляемую сборку взаимодействия для ссылки из кода VB.Net.

Если ваш VB.Code представляет собой внепроцессный COM-сервер, вы должны пометить классы, которые вы хотите использовать как COM, с помощью атрибута COMVisible, а затем использовать инструмент RegAsm для регистрации сборки в COM.

Другая альтернатива - компилировать код C ++ как управляемый C ++ и ссылаться на него из кода VB как стандартную управляемую сборку. Преимущество этого подхода состоит в том, что вы полностью обойдете уровень взаимодействия COM и полностью останетесь в управляемом мире, который имеет определенные превосходные преимущества. с другой стороны, есть два недостатка: а) ваш код на C ++ будет доступен только для этого конкретного клиента, если вы не поместите его в GAC, и б) написание управляемого C ++ потребует небольшого увеличения скорости. Я не думаю, что первый из них повлияет на вас, так как в вашем сценарии кажется, что COM использовался только как удобный способ перехода от кода VB6 к более низкому уровню C ++. Однако второе может доставить вам некоторые неприятности.

Обновление : Судя по обновлению вашего комментария, на самом деле у вас есть код C ++, который вызывается непосредственно из кода VB, который, в свою очередь, вызывается через COM от других клиентов.

Если это действительно так, то я предлагаю перекомпилировать код VB6 как VB.Net (и вам, возможно, придется внести некоторые изменения в код, так как две платформы не абсолютно идентичны), и выставить он использует COMVisible в качестве COM-объекта и использует P / Invoke для потребления текущего кода C ++ (что довольно похоже на то, как в настоящее время его использует ваш код VB6). Не должно быть необходимости перекомпилировать C ++ как управляемый компонент C ++.

...