Постепенно рефакторинг фрагментов гигантского монолитного приложения VB6 winforms в .Net - PullRequest
4 голосов
/ 16 июля 2010

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

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

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

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

Что такоелучший способ пойти об этом?

Спасибо !!

Ответы [ 2 ]

0 голосов
/ 16 июля 2010

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

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

  1. Написать приложение \ службу, которая а) порождает ребенкапроцессы и b) размещает службу WCF для облегчения связи между процессами
  2. Запись дочерних процессов для процесса "Действия"

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

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

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

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

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

0 голосов
/ 16 июля 2010

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

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

...