Постепенный рефакторинг частей гигантского монолитного приложения winforms на VB6 в .Net

Вкратце, приложение ищет в базе данных инструкцию о том, что нужно сделать, выполняет действие и сохраняет информацию об успехе или неудаче этого действия обратно в базу данных. Он выполняет около 40 различных действий, таких как автоматизация приложений Office, копирование файлов, выполнение поиска и т. Д.

Приложение представляет собой единый EXE-файл, поэтому все работает в пространстве процессов основного приложения, и это является основным источником нестабильности, поскольку для выполнения работы ему приходится загружать множество сторонних DLL, и они часто делают что-то сомнительное, что приводит к сбою все приложение.

План: я хочу переместить код, который выполняет опасную тяжелую работу, из VB6 exe во внешние процессы, которые выполняются независимо от основного приложения. Исходное приложение будет обрабатывать только данные из базы данных и инициировать другие процессы, чтобы делать ставки.

Как лучше всего это сделать? Если бы я все еще работал с VB6, думаю, я бы создавал для этого ActiveX EXE, но я не уверен, что такое эквивалент .Net. В идеале приложение VB6 объявляет объект, который создает экземпляр внешнего процесса, и, используя методы параметров набора объектов, выполняет процесс, возможно, получает уведомления о ходе выполнения и, наконец, получает результаты операции.

Как лучше всего это сделать?

Спасибо!!


person Roger Harvest    schedule 16.07.2010    source источник


Ответы (2)


В вашем случае создание другого процесса (через консольное приложение или что-то еще), вероятно, не является хорошей идеей. Вы должны беспокоиться об общении с этим процессом, который может быть настоящей проблемой, и на самом деле это не принесет вам никакой стабильности. Я бы, вероятно, использовал VB.NET для создания библиотеки классов COM-Visible, которая использует темы BackgroundWorker.

Это даст вам возможность работать в фоновом режиме в библиотеке .NET, и на самом деле это никак не повлияет на приложение VB6, если вы будете осторожны с управлением исключениями (в библиотеке .NET). Приложение VB6 может дождаться, пока библиотека .NET выполнит тяжелую работу, и передать ей приятное дружеское сообщение.

person Scott Anderson    schedule 16.07.2010
comment
Спасибо, Скотт. Худшая ошибка, которую я пытаюсь избежать, - это когда код в сторонней dll вызывает нарушение доступа к памяти, и хост-приложение просто исчезает, а обработчик ошибок в VB6 даже не срабатывает. Обеспечивает ли описываемое вами решение лучшую защиту от подобных ситуаций? - person Roger Harvest; 16.07.2010
comment
К сожалению, скорее всего, нет. В этом случае создание другого процесса, вероятно, является единственным реальным способом. Вы можете создать консольное приложение, которое записывает в файл журнала на жестком диске. Затем вы можете посмотреть этот файл на VB6. WCF тоже может работать. Вы могли бы написать библиотеку классов .NET COM-Visible, которая вызывает службу WCF, поскольку вы не можете вызвать WCF непосредственно из VB6. - person Scott Anderson; 16.07.2010
comment
Я не хочу сказать, что вы вообще не можете вызвать службу WCF из VB6, это просто потребует создания службы RESTful и использования VB6 для выполнения некоторых HTTP-запросов GET или чего-то еще. - person Scott Anderson; 16.07.2010
comment
Вы могли бы написать библиотеку классов .NET COM-Visible, которая вызывает службу WCF, поскольку вы не можете вызвать WCF напрямую из VB6 - теперь это так очевидно! Спасибо, Скотт, это направление, которое я собираюсь попробовать. - person Roger Harvest; 16.07.2010

Хм, не могу сказать, что пробовал что-то подобное раньше, но

Одно из возможных решений

  1. Напишите приложение \ службу, которое а) порождает дочерние процессы и б) размещает WCF service для облегчения взаимодействия между процессами.
  2. Напишите дочерние процессы для обработки «Действия»

Другое возможное решение

Альтернативой может быть использование Windows Workflow Foundation 4. Он относительно стабилен и относительно прост в использовании (я сам пробовал этим заниматься). Я не знаю, предлагает ли он необходимую изоляцию, но стоит посмотреть.

По сути, вы должны создать свои собственные действия для выполнения своих действий, а затем динамически выполнять их через WorkflowInvoker.

Еще одно возможное решение

Еще одна альтернатива, которая может быть несколько тяжелой, но несколько более традиционна с точки зрения однопроцессного хостинга и предлагает необходимую вам изоляцию, - это изучить Структура управляемых надстроек [MAF] (см. раздел ссылки об уровнях изоляции). Это может показаться несколько пугающим, но мой друг Кент Бугарт проделал с этим несколько отличных вещей , и если вы будете простыми, это может просто переломить ситуацию.

person johnny g    schedule 16.07.2010
comment
Спасибо, Джонни. Я думал, что WCF может сыграть в этом роль. Как подключить приложение VB6 к службам WCF? - person Roger Harvest; 16.07.2010
comment
хм, я не эксперт по vb, но уверен, что есть много примеров [здесь, на SO и в других местах], которые помогут вам там начать. еще два цента: я всегда считал полезным проверять и исследовать методы и технологии, которые являются новыми для меня в простых приложениях с микки-маусом. как только я понимаю, как работает новая технология, затем я начинаю разбираться, как ее применять. Попробуй :) - person johnny g; 16.07.2010
comment
Еще раз спасибо, добрый совет - сначала разберусь в песочнице. - person Roger Harvest; 16.07.2010
comment
не беспокойтесь, подтверждение - только что понял, что vb6 не управляется, не осознавал, что были проблемы с взаимодействием. надеюсь, что это было несколько полезно, и удачи! :) - person johnny g; 16.07.2010