Я также рекомендую последний вариант. То, что я бы сделал для безопасной реализации с наименьшим количеством изменений, выглядит следующим образом.
Сделайте резервную копию или проверьте все в вашем контроле исходного кода и создайте ветку.
Создайте новый проект ActiveX DLL. Я бы назвал это некоторым вариантом UI_Controller
Примечание. Новый проект заставит вас определить скрытые зависимости в EXE-файле.
Сделайте ссылку на все, что сейчас является EXE-файлом.
Сделайте так, чтобы проект EXE ссылался на UI_Controller.
Создайте класс для каждой основной формы в приложении.
Скопируйте второстепенные диалоги в DLL-библиотеку UI_Controller.
Для каждой формы создайте интерфейсный класс в DLL-библиотеке UI_Controller (форма будет
реализуя это)
Пример: если у вас есть шесть основных форм, у вас есть шесть интерфейсов форм и шесть классов контроллеров
Просмотрите форму для каждой процедуры и события. Скопируйте процедуру в класс контроллера UI и сделайте ее общедоступной.
Убедитесь, что у каждого класса контроллеров есть процедура Init.
Однако есть исключение, и это в том случае, если код имеет дело только с другими элементами управления и формой. Например, событие Resize переставляет код. Причина этого в том, что логика характерна для этого стиля формы. Другая форма или пользовательский интерфейс, использующий класс контроллера, будет иметь другой алгоритм изменения размера, поэтому нет смысла переносить этот код. Вы должны будете использовать свое лучшее суждение.
Вернитесь к классам контроллера. Многие из процедур должны будут ссылаться на элементы в конкретной форме или вызывать события в форме. Напишите заголовок подпрограммы или функцию в своем классе интерфейса формы, чтобы позволить этому событию произойти или получить необходимую информацию.
Обратите внимание, что если вы обнаружите, что одни и те же действия сгруппированы вместе или одна и та же последовательность извлеченной информации рассматривается как вариант создания только одной подпрограммы вместо нескольких.
Измените любые прямые ссылки на форму на вызов в интерфейсе.
Ваши основные формы должны реализовывать каждый интерфейс. Создайте класс GlobalMultiUse в своей DLL контроллера UI, который позволяет EXE регистрировать каждую форму на своем контроллере. Подпрограммы регистра должны принимать только объект интерфейса формы. В вашем приложении инициализации передайте все основные формы для правильной функции регистрации, прежде чем делать что-либо еще.
Запустите ваш проект и исправьте все ошибки. Обратите внимание, что реальная функция вашего программного обеспечения должна оставаться такой же, как вы должны были только копировать и внедрять.
Когда программное обеспечение работает без ошибок. Проверьте это в своем контроле источника или сделайте резервную копию.
Начните заменять каждую процедуру ОДНОЙ из ваших основных форм вызовом соответствующего метода формы вашего контроллера. Если какая-либо другая форма вызывает что-то в форме, над которой вы работаете, переключитесь на контроллер.
Когда вы закончите, убедитесь, что инициализация формы контроллера вызывается в разделе инициализации вашего приложения. Вам нужно переключиться на использование Sub Main, чтобы это работало.
Когда это работает правильно, работайте над другой формой. Продолжайте делать это, пока все формы не будут преобразованы.
Очистите все, что не используется.
Проверка, и если она прошла, то все готово.
Теперь у вас есть приложение, в котором вы можете удалить текущий интерфейс и заменить его на все, что реализует интерфейсы форм. Таким образом, вы можете иметь невидимый EXE-файл, EXE-файл модульного теста и ваш обычный EXE-файл.
Вам нужно будет решить, что лучше для вас, исходя из сложности вашего приложения. У вас может быть частичное преобразование, когда вы предоставляете только одну или две формы классу контроллера.