.NET COM DLL не работает с vb6 через домены приложений - PullRequest
0 голосов
/ 19 апреля 2009

У нас большое приложение vb6, и, когда нам нужно что-то изменить / исправить, мы перемещаем разделы в .net, ориентируясь на фреймворк 2.0. Мы переместили несколько классов в .net dll, и они правильно настроены для доступа к com.

Вот проблема: MainAppVB6.exe создает экземпляр DOTNET_COM.ComClass. Он передает это методу в другой .net dll, который передает его через домен приложения. Это не проблема для COM-объектов, написанных в vb6.

.net видит границу домена приложения и хочет, чтобы объекты были сериализуемыми или marshalbyref. Поскольку нам нужна часть .net для изменения данных, которые возвращаются в vb6, сериализуемый не работает. Если мы отметим классы в Inherits MarshalByRefObject, то получим «Этот удаленный прокси-сервер не имеет приемника каналов, что означает, что либо у сервера нет зарегистрированных каналов сервера, которые прослушивают, либо у приложения нет подходящего клиентского канала для связи с сервером».

Нет каналов - мы просто перебираем домен приложения в одной и той же dll. Похоже, что .net не рассматривает объект как COM, что он должен делать.

Если я удаляю и marshalbyref, и сериализуемые, все будет работать, только если объект com создан в vb6. Если функциональность .net в домене приложения создает объект и назначает его для передачи обратно в vb6, vb6 выдает мне ошибки автоматизации.

Очень уродливый клочок - сериализовать объект в новом домене приложения, отправить обратно xml и позволить десериализации vb6, но это кажется смешным.

У кого-нибудь есть идеи?

Спасибо.

Сет

Ответы [ 2 ]

0 голосов
/ 02 февраля 2018

Необходимо создать промежуточный монтажный фасад. Затем вы создаете AppDomain в Фасаде приложения - он отвечает за управление конвейером вашего приложения с dll vb6.

Vb <===> Фасад (appDomain) <====> Вход в систему с dll vb6

0 голосов
/ 19 апреля 2009

Вы можете создать делегата для соответствующего метода-мутатора в своем классе COM в первом методе .NET, передать этот делегат через границу AppDomain, использовать этот делегат для изменения объекта COM во втором методе .NET, а затем вернуть мутировал объект обратно в VB6. Методы класса маршала могут пригодиться. :)

Редактировать из комментария: А как насчет создания копии .net класса vb6 в первом вызове .net, передачи этого нового объекта всем вызовам .net, которые вам нужно сделать, и затем исправления возврата вашего com-объекта. Это может быть проще, чем десериализация в vb6.

...