VB6/.NET Form Interop

У меня есть проект VB6, скомпилированный как VB6 exe.

Он имеет простую форму в качестве объекта запуска.

Он запускает модальную форму.NET через dll regasm'd .NET, передавая ему реализацию COM-интерфейса обратного вызова (IHandler).

.NET обращается к реализации IHandler в VB6.

VB6 пытается показать новую форму, используя vbModal. Форма VB6 заблокирована от взаимодействия из-за модальной формы.NET, которая все еще видна.

Есть ли способ обойти это или предложенный подход?

Я попытался перезвонить VB6 в новом (STA) (управляемом) потоке, но когда он пытается выполнить MyCallbackForm.Show vbModal, я получаю "Недопустимый вызов процедуры или аргумент."... что, я полагаю, связано с фактом что я перезваниваю на новую тему...

Обновление: я был в состоянии успешно сделать обратный вызов в новом потоке и показать мою форму VB6 модально, ЕСЛИ я установил свой тип проекта VB6 на ActiveX exe... но как только я сделал это, я, казалось, потерял поток на обратном вызове - создание последующие вызовы из VB6 в.NET привели к исключению перекрестного потока. Я предполагаю, что это связано с моделью потоков при использовании ActiveX exe....

2 ответа

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

  • создайте.NET usercontrol, который содержит весь контент, который должен быть в форме.
  • Используйте MS InteropToolkit, чтобы легко создать видимый COM-контроль пользователя, и пусть этот элемент управления наследуется от usercontrol (вы также можете пропустить первый шаг и сделать пользовательский контроль напрямую видимым)
  • создайте новую форму в своем проекте VB6 и добавьте в нее пользовательский контроль COMVisible .NET.

Вы можете разделить ваш проект VB6 EXE на два проекта.
Первый проект - это текущий проект VB6 за вычетом подчиненной формы, которую вы хотите отображать из вашей.Net DLL. Второй проект - это проект VB6 ActiveX DLL, который должен содержать подчиненную (ые) форму (и), которую вы хотите отображать в вашей.Net dll.

Итак, вместо того, чтобы делать: 1. Проект VB6.exe вызывает.Net DLL, передавая IHandler 2. Проект проекта.Net вызывает в IHandler 3. IHandler (реализация VB6) пытается показать подчиненную форму, не везет.

Вы делаете: 1. Проект VB6.exe вызывает DLL-библиотеку.Net, передавая все данные, необходимые субформам из основного проекта. 2. Проект.Net вызывает функцию "ShowYourSelf" в DLL-библиотеке ActiveX, содержащей подчиненную форму (-и), и передает любые данные. необходимый.

Другие вопросы по тегам