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, содержащей подчиненную форму (-и), и передает любые данные. необходимый.