2010-11-09 3 views
0

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

Мне нужно перенести их в Visual Studio 2008. Тем не менее, у меня есть некоторые вопросы

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

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

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

+0

Alex Вам может потребоваться решить проблему и задать несколько вопросов о перекодировке отдельных бит в VB.net. –

ответ

1

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

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

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

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

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

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

+0

Единственное, что я знаю, это то, что vb6 загружает dll с помощью Private Declare Function x_ImageType Lib «xImage.dll», который скомпилирован с использованием приложений C++ и других, вызывает эти функции VB6. Я пытался использовать Tlbimp для C++, но это не помогло, так как это было недействительной библиотекой. – Alex

+0

Это скорее всего означает, что исполняемый файл VB является клиентом, использующим COM-класс C++. –

+0

Я думаю, что вы правы, он потребляет – Alex

1

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

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

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

У вас есть следующие варианты.

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

Могу ли я перекомпилировать C++ в C++? а затем написать некоторые в vb.net или C# в эту DLL? или мне нужно перекодировать всю программу на C++? – Alex

+0

Нет функциональности Active X, необходимо получить управляемую C++-оболочку в MC++. –

+0

VB6 можно обновить до VB.Net полуавтоматически с помощью мастера обновления VB.Net. Существуют сторонние инструменты, которые утверждают, что автоматически обновляют VB6 до VB.Net с очень высокой точностью. – MarkJ

1

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

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

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

У меня есть нулевой навык C++, поэтому как узнать, является ли C++ DLL обычным, а не COM. И в этом случае используйте P/invoke – Alex

+0

Вы сказали в другом месте, что VB6 загружает C++ DLL, используя 'Declare Function', что означает, что C++ DLL должна быть обычной DLL, а не COM-версией. Вам нужны некоторые объявления P/Invoke в VB.Net. Вы можете либо (i) преобразовать VB6 'Declare' в VB.Net' Declare', который, я думаю, вам нужно сделать вручную, либо (ii) найти объявление функции C++, скопировать и вставить его в * P/Invoke Interop Assistant *, а затем он будет генерировать заявление VB.Net для вас или (iii) если есть только один или два заявления 'Declare', которые вы могли бы разместить здесь, и мы могли бы их конвертировать для вас :) – MarkJ

Смежные вопросы