Несколько квартир VB6 в приложении C#
У нас есть очень старое унаследованное приложение vb6, которое имеет один глобальный объект, который служит в качестве Application Core, который хранит различные настройки приложения, вызывает операции с базой данных и так далее. Несколько модулей с разными progid используют этот глобальный объект и не имеют проблем с ним из-за однопотоковой квартиры.
Недавно было создано новое приложение WPF, которое предоставляет нам переход от vb6, однако оно все еще ограничено наследием vb6 из-за некоторых архитектурных ошибок. Он может подключаться только к одной базе данных на экземпляр приложения. Он содержит статический экземпляр глобального объекта vb6 в классе-обертке, который служит мостом для достижения устаревших функций.
Сейчас мы разрабатываем новое приложение, которое не должно ограничиваться старым унаследованным кодом, в частности, это новое приложение должно иметь возможность подключаться к нескольким базам данных одновременно, но есть одна загвоздка: код vb6 ограничен одной базой данных, поэтому должен быть несколько экземпляров глобальных объектов vb6, по одному на каждую базу данных.
Поэтому возникает вопрос: возможно ли это, и если да, то как можно использовать несколько отдельных экземпляров глобальных объектов vb6 в одном приложении C#?
Я предполагаю, что каждый экземпляр такого объекта должен жить в своем собственном STA- потоке, но я не знаю, как создавать такие потоки, которые поддерживаются в течение всего времени выполнения приложения и имеют ассоциированные оболочки, содержащие экземпляры глобальных объектов vb6 и поддержка вызова некоторых функций из потока GUI (и как организовать такое межпотоковое взаимодействие, там нет thread.invoke(...)). Я думал об использовании модели диспетчеризации wpf (класс-оболочка - DispatcherObject, каждый экземпляр имеет свой собственный Dispatcher со своим собственным STA-потоком), но я не вижу, как реализовать такую вещь. Также я думаю, что это может быть реализовано путем загрузки каждого экземпляра класса-оболочки (статического) в разные домены приложений, но я не знаю, решает ли это проблему STA для COM.
2 ответа
Вы можете избежать запуска одного экземпляра глобального объекта в AppDomain
,
Чтобы быть в безопасности, вы должны запускать их каждый в своем собственном процессе, так как это предположение, с которым они были созданы. Я гарантирую вам, что ужасные вещи могут случиться, когда вы нарушаете предположения древнего кода - особенно когда вы знакомите их с вещами, которых просто не было, когда они были написаны.
Это возможно, используя то, что называется неуправляемым кодом. Проверьте это: http://www.codeproject.com/Articles/154144/Using-Unmanaged-VB6-Code-in-NET