Я ничего не сделал с PowerBuilder, но эту технику мы использовали (довольно успешно) в проекте, который не может быть немедленно перенесен с VB6.
1) Мы создали шим / фасад с COM-ссылками для предоставления нужных нам элементов .NET. (Мы также указали атрибуты GUID using, чтобы иметь полный контроль над изменениями совместимости.)
2) Мы ссылались на COM-объекты в нашем коде VB6 (как в коде PowerBuilder), используя встроенную обработку объектов (OleObject в вашем случае).
3) Поскольку элементы были перенесены (в нашем случае на C #), они ссылались на базовые классы .NET вместо COM-прокладки. (Мы пометили прокладку устаревшими тегами, чтобы никто не использовал ее случайно.)
4) После того, как все ссылки на прокладку были перенесены, мы удалили прокладку. (На самом деле мы делали это в два этапа. На первом этапе мы оставляли прокладку включенной, но модифицировали ее, чтобы генерировать исключения и регистрировать всю возможную информацию о вызовах. Таким образом, у нас будет представление о том, где выполняются какие-либо вызовы. сделано из. После подтверждения, что не было никаких проблем, прокладка была удалена на следующем этапе.)
Преимущество этого для нас состояло в том, что миграция может происходить постепенно. Мы решили не раскрывать базовые объекты .NET напрямую, потому что все еще существует некоторый риск их изменения, и нам нужно, чтобы интерфейс COM был как можно более стабильным.
Обновление до PB.NET, безусловно, возможно ... но я не знаю, насколько сложной будет эта миграция. Вы можете найти необходимое время, чтобы сделать миграцию крупным проектом (это, безусловно, было бы для нас).
Другие методы, которые мы рассматривали, но отклонили как неприемлемые для наших нужд:
Завершение компонентов .NET в другое приложение («служба») и обмен данными с этими компонентами через сокетную связь.
«Оболочка» для утилит, использующих .NET Framework, и передача информации через (например) файловый механизм.
Что следует знать:
Модель с резьбой используется с обеих сторон звена. (Сначала мы отсиживались, потому что одна часть системы запускала MTA вместо STA - см. этот вопрос для получения дополнительной информации.)
Какое исключение на стороне .NET будет выглядеть из вашего приложения. Это может быть очень бесполезной «общей» ошибкой, и даже может показаться, что она в вызывающей программе вместо .NET-кода. Мы добавили запись в журнале на стороне .NET, которая давала более подробные записи о любых исключениях, прежде чем перебрасывать их и позволять вызывающей стороне обрабатывать вещи как можно лучше.
Надеюсь, это поможет. Удачи!